@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
@@ -0,0 +1,317 @@
1
+ id: creative_generative
2
+ version: "1.0.0"
3
+ title: "Generative creative agent"
4
+ category: creative_generative
5
+ summary: "Agent that takes a brief and generates finished creatives from scratch — no input assets required."
6
+
7
+ narrative: |
8
+ You run a generative creative platform — an AI ad network, a generative DSP, or any system
9
+ that creates ad creatives from a natural-language brief and brand identity. The buyer doesn't
10
+ push assets to you. Instead, they describe what they want, point you at a brand.json, and
11
+ your agent produces finished creatives ready for trafficking.
12
+
13
+ This is fundamentally different from template-based transformation (Celtra) or library-based
14
+ retrieval (Innovid). Your agent creates something new. The buyer sends a brief, optionally
15
+ with seed assets or constraints, and your platform generates creatives — potentially in
16
+ multiple formats at once.
17
+
18
+ This storyboard walks through the generation flow: format discovery, brief-driven generation,
19
+ multi-format builds, iterative refinement, and quality progression from draft to production.
20
+
21
+ agent:
22
+ interaction_model: stateless_generate
23
+ capabilities:
24
+ - supports_generation
25
+ examples:
26
+ - "OpenAds"
27
+ - "AI ad networks"
28
+ - "Generative DSPs"
29
+
30
+ caller:
31
+ role: buyer_agent
32
+ example: "Scope3 (DSP)"
33
+
34
+ prerequisites:
35
+ description: |
36
+ The caller needs a brand identity (brand.json at the brand's domain) for the agent
37
+ to resolve visual identity — logos, colors, fonts, tone. The test kit provides a
38
+ sample brand with campaign parameters.
39
+ test_kit: "test-kits/acme-outdoor.yaml"
40
+
41
+ phases:
42
+ - id: format_discovery
43
+ title: "Discover generative formats"
44
+ narrative: |
45
+ The buyer needs to know what your agent can generate. Unlike a template platform
46
+ where formats are fixed dimensions, generative formats describe what the agent
47
+ produces — the output type, constraints, and what inputs it accepts. A generative
48
+ format might be "display_300x250_generative" that accepts a brief and produces
49
+ a finished banner, or "social_post_generative" that creates platform-native content.
50
+
51
+ steps:
52
+ - id: discover_formats
53
+ title: "Discover available generative formats"
54
+ narrative: |
55
+ The buyer asks: "What can you generate?" Your platform returns the formats
56
+ you support. Each format describes the output type, dimensions, and what
57
+ inputs it needs (brief text, brand reference, seed images, etc.).
58
+ task: list_creative_formats
59
+ schema_ref: "creative/list-creative-formats-request.json"
60
+ response_schema_ref: "creative/list-creative-formats-response.json"
61
+ doc_ref: "/creative/task-reference/list_creative_formats"
62
+ comply_scenario: creative_sync
63
+ stateful: false
64
+ expected: |
65
+ Return your generative formats. Each format should include:
66
+ - format_id with your agent_url and a unique id
67
+ - Human-readable name and description
68
+ - Asset slots describing what inputs are accepted (brief text, images, etc.)
69
+ - Render dimensions for the output
70
+ - Variables for any dynamic fields the buyer can control
71
+
72
+ sample_request: {}
73
+
74
+ validations:
75
+ - check: response_schema
76
+ description: "Response matches list-creative-formats-response.json schema"
77
+ - check: field_present
78
+ path: "formats"
79
+ description: "Response contains a formats array"
80
+ - check: field_present
81
+ path: "formats[0].format_id.agent_url"
82
+ description: "Each format has a format_id with agent_url"
83
+
84
+ - id: generate_from_brief
85
+ title: "Generate from brief"
86
+ narrative: |
87
+ The buyer describes what they want in natural language and your agent generates
88
+ a creative from scratch. The brief includes the campaign message, target audience
89
+ context, and a brand reference so your agent can resolve visual identity.
90
+
91
+ This is the core generative flow. The buyer doesn't provide finished assets —
92
+ they provide intent, and your agent creates.
93
+
94
+ steps:
95
+ - id: build_draft
96
+ title: "Generate a draft creative from brief"
97
+ narrative: |
98
+ The buyer sends a brief describing the campaign and a target format. Your
99
+ agent generates a draft creative — fast, lower-fidelity output the buyer can
100
+ review before committing to a production build.
101
+
102
+ The brief is passed as a message alongside the target format. The brand
103
+ reference lets your agent resolve brand.json for visual identity.
104
+ task: build_creative
105
+ schema_ref: "media-buy/build-creative-request.json"
106
+ response_schema_ref: "media-buy/build-creative-response.json"
107
+ doc_ref: "/creative/task-reference/build_creative"
108
+ comply_scenario: creative_flow
109
+ stateful: false
110
+ expected: |
111
+ Return a generated creative manifest:
112
+ - creative_manifest with the generated assets (images, copy, serving code)
113
+ - format_id matching the target format
114
+ - If include_preview is true, include a preview render
115
+
116
+ The output should be a coherent creative that reflects the brief and brand
117
+ identity — not a template with placeholder text.
118
+
119
+ sample_request:
120
+ message: "Create a display banner for a summer outdoor gear sale. Bold, adventurous tone. Headline should emphasize 40% off. Target audience: active adults 25-54."
121
+ target_format_id:
122
+ agent_url: "https://your-agent.example.com"
123
+ id: "display_300x250_generative"
124
+ brand:
125
+ domain: "acme-outdoor.example.com"
126
+ quality: "draft"
127
+ include_preview: true
128
+
129
+ validations:
130
+ - check: response_schema
131
+ description: "Response matches build-creative-response.json schema"
132
+ - check: field_present
133
+ path: "creative_manifest.assets"
134
+ description: "Output manifest includes generated assets"
135
+ - check: field_present
136
+ path: "creative_manifest.format_id"
137
+ description: "Output manifest includes format_id"
138
+
139
+ - id: refine
140
+ title: "Refine the creative"
141
+ narrative: |
142
+ The buyer reviews the draft and wants changes. They send the generated manifest
143
+ back with refinement instructions. Your agent modifies the creative based on the
144
+ feedback — adjusting copy, swapping imagery, or changing the layout.
145
+
146
+ This is iterative: the buyer can refine multiple times until they're satisfied,
147
+ then request a production-quality build.
148
+
149
+ steps:
150
+ - id: refine_creative
151
+ title: "Refine with feedback"
152
+ narrative: |
153
+ The buyer passes the generated manifest back with a message describing what
154
+ to change. Your agent applies the refinements and returns an updated creative.
155
+ task: build_creative
156
+ schema_ref: "media-buy/build-creative-request.json"
157
+ response_schema_ref: "media-buy/build-creative-response.json"
158
+ doc_ref: "/creative/task-reference/build_creative"
159
+ comply_scenario: creative_flow
160
+ stateful: false
161
+ expected: |
162
+ Return a refined creative manifest reflecting the requested changes.
163
+ The output should preserve what worked in the original while applying
164
+ the refinements.
165
+
166
+ sample_request:
167
+ message: "Make the headline larger. Replace the mountain imagery with a trail running scene. Add a CTA button that says 'Shop Now'."
168
+ creative_manifest:
169
+ format_id:
170
+ agent_url: "https://your-agent.example.com"
171
+ id: "display_300x250_generative"
172
+ assets:
173
+ - asset_id: "generated_image"
174
+ asset_type: "image"
175
+ url: "https://your-agent.example.com/generated/abc123.jpg"
176
+ - asset_id: "headline"
177
+ asset_type: "text"
178
+ text: "Summer Sale — 40% Off All Gear"
179
+ target_format_id:
180
+ agent_url: "https://your-agent.example.com"
181
+ id: "display_300x250_generative"
182
+ brand:
183
+ domain: "acme-outdoor.example.com"
184
+ quality: "draft"
185
+ include_preview: true
186
+
187
+ validations:
188
+ - check: response_schema
189
+ description: "Response matches build-creative-response.json schema"
190
+ - check: field_present
191
+ path: "creative_manifest.assets"
192
+ description: "Refined manifest includes assets"
193
+
194
+ - id: multi_format
195
+ title: "Multi-format generation"
196
+ narrative: |
197
+ The buyer needs the creative in multiple sizes. Instead of generating each
198
+ format separately, they pass target_format_ids (plural) and your agent produces
199
+ all formats in a single call. This is where generative agents shine — adapting
200
+ a concept across formats while maintaining visual coherence.
201
+
202
+ steps:
203
+ - id: build_multi_format
204
+ title: "Generate for multiple formats"
205
+ narrative: |
206
+ The buyer passes the refined manifest with multiple target formats. Your
207
+ agent generates a creative for each format, adapting layout, copy, and
208
+ imagery to fit each size while maintaining brand consistency.
209
+ task: build_creative
210
+ schema_ref: "media-buy/build-creative-request.json"
211
+ response_schema_ref: "media-buy/build-creative-response.json"
212
+ doc_ref: "/creative/task-reference/build_creative"
213
+ comply_scenario: creative_flow
214
+ stateful: false
215
+ expected: |
216
+ Return creative manifests for each requested format in creative_manifests
217
+ (plural). Each manifest should:
218
+ - Have a format_id matching one of the target formats
219
+ - Contain complete, format-appropriate assets
220
+ - Maintain visual coherence across formats
221
+
222
+ If a format cannot be produced, include it with an error — don't fail
223
+ the entire request.
224
+
225
+ sample_request:
226
+ message: "Generate production-ready versions for all three sizes."
227
+ creative_manifest:
228
+ format_id:
229
+ agent_url: "https://your-agent.example.com"
230
+ id: "display_300x250_generative"
231
+ assets:
232
+ - asset_id: "generated_image"
233
+ asset_type: "image"
234
+ url: "https://your-agent.example.com/generated/abc123-refined.jpg"
235
+ - asset_id: "headline"
236
+ asset_type: "text"
237
+ text: "Summer Sale — 40% Off All Gear"
238
+ - asset_id: "cta"
239
+ asset_type: "text"
240
+ text: "Shop Now"
241
+ target_format_ids:
242
+ - agent_url: "https://your-agent.example.com"
243
+ id: "display_300x250_generative"
244
+ - agent_url: "https://your-agent.example.com"
245
+ id: "display_728x90_generative"
246
+ - agent_url: "https://your-agent.example.com"
247
+ id: "display_320x50_generative"
248
+ brand:
249
+ domain: "acme-outdoor.example.com"
250
+ quality: "production"
251
+
252
+ validations:
253
+ - check: response_schema
254
+ description: "Response matches build-creative-response.json schema"
255
+ - check: field_present
256
+ path: "creative_manifests"
257
+ description: "Response contains creative_manifests array (plural)"
258
+
259
+ - id: production_build
260
+ title: "Production build"
261
+ narrative: |
262
+ The buyer is satisfied with the concept and needs a final, production-quality
263
+ creative ready for trafficking. They switch quality from draft to production.
264
+ Your agent generates the finished output with full-fidelity assets.
265
+
266
+ steps:
267
+ - id: build_production
268
+ title: "Build at production quality"
269
+ narrative: |
270
+ The buyer requests a production-quality build of the approved concept. Your
271
+ agent generates the final creative with full-fidelity rendering, polished
272
+ assets, and serving code ready for trafficking.
273
+ task: build_creative
274
+ schema_ref: "media-buy/build-creative-request.json"
275
+ response_schema_ref: "media-buy/build-creative-response.json"
276
+ doc_ref: "/creative/task-reference/build_creative"
277
+ comply_scenario: creative_flow
278
+ stateful: false
279
+ expected: |
280
+ Return a production-quality creative manifest:
281
+ - Full-fidelity generated assets
282
+ - Serving code (HTML, JavaScript, or VAST) ready for trafficking
283
+ - Provenance metadata if AI-generated (digital_source_type, ai_tool)
284
+
285
+ sample_request:
286
+ message: "Final production build. No changes needed."
287
+ creative_manifest:
288
+ format_id:
289
+ agent_url: "https://your-agent.example.com"
290
+ id: "display_300x250_generative"
291
+ assets:
292
+ - asset_id: "generated_image"
293
+ asset_type: "image"
294
+ url: "https://your-agent.example.com/generated/abc123-refined.jpg"
295
+ - asset_id: "headline"
296
+ asset_type: "text"
297
+ text: "Summer Sale — 40% Off All Gear"
298
+ - asset_id: "cta"
299
+ asset_type: "text"
300
+ text: "Shop Now"
301
+ target_format_id:
302
+ agent_url: "https://your-agent.example.com"
303
+ id: "display_300x250_generative"
304
+ brand:
305
+ domain: "acme-outdoor.example.com"
306
+ quality: "production"
307
+ include_preview: true
308
+
309
+ validations:
310
+ - check: response_schema
311
+ description: "Response matches build-creative-response.json schema"
312
+ - check: field_present
313
+ path: "creative_manifest.assets"
314
+ description: "Production manifest includes assets"
315
+ - check: field_present
316
+ path: "creative_manifest.format_id"
317
+ description: "Production manifest includes format_id"
@@ -0,0 +1,284 @@
1
+ id: creative_lifecycle
2
+ version: "1.0.0"
3
+ title: "Creative lifecycle"
4
+ category: creative_lifecycle
5
+ summary: "Full creative lifecycle on a stateful platform: sync multiple creatives, list with filtering, build and preview across formats, observe status transitions."
6
+ track: creative
7
+ required_tools:
8
+ - list_creative_formats
9
+
10
+ narrative: |
11
+ You run a creative platform with a persistent library — an ad server, creative management
12
+ platform, or publisher that accepts and stores creative assets. A buyer agent pushes
13
+ multiple creatives in different formats, queries the library, builds serving tags, previews
14
+ renderings, and monitors creative status as assets move through your review pipeline.
15
+
16
+ This storyboard covers the complete creative lifecycle from the buyer's perspective:
17
+ uploading assets, browsing the library, building deliverables across formats, and
18
+ observing status transitions as creatives move from pending_review through to accepted.
19
+
20
+ The individual creative storyboards (template, ad server, sales agent) cover specific
21
+ interaction models. This storyboard tests the full lifecycle across multiple creatives
22
+ and formats on a single platform.
23
+
24
+ agent:
25
+ interaction_model: stateful_preloaded
26
+ capabilities:
27
+ - has_creative_library
28
+ - supports_transformation
29
+ examples:
30
+ - "Innovid"
31
+ - "Flashtalking"
32
+ - "CM360"
33
+ - "Creative management platforms"
34
+
35
+ caller:
36
+ role: buyer_agent
37
+ example: "Pinnacle Agency (buyer)"
38
+
39
+ prerequisites:
40
+ description: |
41
+ The caller needs creative assets in multiple formats (display, video, native) and
42
+ a brand identity. The test kit provides sample assets at standard ad dimensions.
43
+ test_kit: "test-kits/acme-outdoor.yaml"
44
+
45
+ phases:
46
+ - id: discover_formats
47
+ title: "Discover accepted formats"
48
+ narrative: |
49
+ Before pushing any creatives, the buyer discovers what formats your platform accepts.
50
+ This determines which assets to prepare and what dimensions and specs to target.
51
+
52
+ steps:
53
+ - id: list_formats
54
+ title: "List creative formats"
55
+ narrative: |
56
+ The buyer calls list_creative_formats to discover what your platform accepts.
57
+ The response defines format specs: dimensions, asset requirements, mime types,
58
+ and any platform-specific constraints.
59
+ task: list_creative_formats
60
+ schema_ref: "creative/list-creative-formats-request.json"
61
+ response_schema_ref: "creative/list-creative-formats-response.json"
62
+ doc_ref: "/creative/task-reference/list_creative_formats"
63
+ comply_scenario: creative_lifecycle
64
+ stateful: false
65
+ expected: |
66
+ Return all creative formats your platform accepts:
67
+ - format_id with your agent_url and unique id
68
+ - Asset requirements (dimensions, file sizes, mime types)
69
+ - Render dimensions
70
+ - At least two formats (e.g., display and video)
71
+
72
+ sample_request: {}
73
+
74
+ validations:
75
+ - check: response_schema
76
+ description: "Response matches list-creative-formats-response.json schema"
77
+ - check: field_present
78
+ path: "formats"
79
+ description: "Response contains formats array"
80
+
81
+ - id: sync_multiple
82
+ title: "Sync multiple creatives"
83
+ narrative: |
84
+ The buyer pushes three creatives in different formats to your platform: a display
85
+ banner, a video spot, and a native card. Your platform validates each creative
86
+ against its format specs and returns per-creative status.
87
+
88
+ steps:
89
+ - id: sync_creatives
90
+ title: "Push three creatives in different formats"
91
+ narrative: |
92
+ The buyer syncs three creatives simultaneously: a 300x250 display banner, a 30s
93
+ video spot, and a native content card. Your platform validates each against its
94
+ format specs and returns per-creative action and status.
95
+ task: sync_creatives
96
+ schema_ref: "creative/sync-creatives-request.json"
97
+ response_schema_ref: "creative/sync-creatives-response.json"
98
+ doc_ref: "/creative/task-reference/sync_creatives"
99
+ comply_scenario: creative_lifecycle
100
+ stateful: true
101
+ expected: |
102
+ Accept and validate all three creatives:
103
+ - Per-creative action: created
104
+ - Per-creative status: accepted or pending_review
105
+ - Validation results for each creative
106
+ - Platform-assigned IDs if applicable
107
+
108
+ sample_request:
109
+ account:
110
+ brand:
111
+ domain: "acmeoutdoor.com"
112
+ operator: "pinnacle-agency.com"
113
+ creatives:
114
+ - creative_id: "display_trail_pro_300x250"
115
+ name: "Trail Pro 3000 - Display 300x250"
116
+ format_id:
117
+ agent_url: "https://your-platform.example.com"
118
+ id: "display_300x250"
119
+ assets:
120
+ - asset_id: "image"
121
+ asset_type: "image"
122
+ url: "https://cdn.pinnacle-agency.example/trail-pro-300x250.png"
123
+ mime_type: "image/png"
124
+ - creative_id: "video_30s_trail_pro"
125
+ name: "Trail Pro 3000 - 30s Video"
126
+ format_id:
127
+ agent_url: "https://your-platform.example.com"
128
+ id: "video_30s"
129
+ assets:
130
+ - asset_id: "video"
131
+ asset_type: "video"
132
+ url: "https://cdn.pinnacle-agency.example/trail-pro-30s.mp4"
133
+ mime_type: "video/mp4"
134
+ - creative_id: "native_trail_pro"
135
+ name: "Trail Pro 3000 - Native Card"
136
+ format_id:
137
+ agent_url: "https://your-platform.example.com"
138
+ id: "native_content"
139
+ assets:
140
+ - asset_id: "image"
141
+ asset_type: "image"
142
+ url: "https://cdn.pinnacle-agency.example/trail-pro-native.png"
143
+ mime_type: "image/png"
144
+ - asset_id: "headline"
145
+ asset_type: "text"
146
+ content: "Trail Pro 3000 — Built for the Summit"
147
+
148
+ validations:
149
+ - check: response_schema
150
+ description: "Response matches sync-creatives-response.json schema"
151
+ - check: field_present
152
+ path: "results"
153
+ description: "Response contains per-creative results"
154
+
155
+ - id: list_and_filter
156
+ title: "List creatives with filtering"
157
+ narrative: |
158
+ The buyer queries the creative library to see their synced creatives. First a broad
159
+ list, then filtered by format. This verifies the library correctly stores and indexes
160
+ the pushed creatives.
161
+
162
+ steps:
163
+ - id: list_all
164
+ title: "List all creatives in library"
165
+ narrative: |
166
+ The buyer calls list_creatives with no filters to see all creatives in the
167
+ library for their account. The response includes the three creatives synced
168
+ in the previous phase.
169
+ task: list_creatives
170
+ schema_ref: "creative/list-creatives-request.json"
171
+ response_schema_ref: "creative/list-creatives-response.json"
172
+ doc_ref: "/creative/task-reference/list_creatives"
173
+ comply_scenario: creative_lifecycle
174
+ stateful: true
175
+ expected: |
176
+ Return creatives in the library:
177
+ - creatives array containing the synced items
178
+ - Each creative includes: creative_id, name, format_id, status
179
+ - At least three creatives from the sync phase
180
+
181
+ sample_request:
182
+ account:
183
+ brand:
184
+ domain: "acmeoutdoor.com"
185
+ operator: "pinnacle-agency.com"
186
+
187
+ validations:
188
+ - check: response_schema
189
+ description: "Response matches list-creatives-response.json schema"
190
+ - check: field_present
191
+ path: "creatives"
192
+ description: "Response contains creatives array"
193
+
194
+ - id: list_filtered
195
+ title: "List creatives filtered by format"
196
+ narrative: |
197
+ The buyer lists creatives filtered to a specific format (display only). The
198
+ response should only include creatives matching that format.
199
+ task: list_creatives
200
+ schema_ref: "creative/list-creatives-request.json"
201
+ response_schema_ref: "creative/list-creatives-response.json"
202
+ doc_ref: "/creative/task-reference/list_creatives"
203
+ comply_scenario: creative_lifecycle
204
+ stateful: true
205
+ expected: |
206
+ Return only creatives matching the format filter:
207
+ - creatives array filtered to display format
208
+ - Should include display_trail_pro_300x250 but not video or native
209
+
210
+ sample_request:
211
+ account:
212
+ brand:
213
+ domain: "acmeoutdoor.com"
214
+ operator: "pinnacle-agency.com"
215
+ filters:
216
+ format_ids:
217
+ - agent_url: "https://your-platform.example.com"
218
+ id: "display_300x250"
219
+
220
+ validations:
221
+ - check: response_schema
222
+ description: "Response matches list-creatives-response.json schema"
223
+ - check: field_present
224
+ path: "creatives"
225
+ description: "Response contains filtered creatives"
226
+
227
+ - id: build_and_preview
228
+ title: "Build and preview across formats"
229
+ narrative: |
230
+ The buyer builds serving tags and previews renderings for the synced creatives.
231
+ This tests multi-format output: a display tag, a VAST tag for video, and a
232
+ native rendering preview.
233
+
234
+ steps:
235
+ - id: preview_display
236
+ title: "Preview the display creative"
237
+ narrative: |
238
+ The buyer calls preview_creative for the display banner to see how it renders
239
+ in the platform's environment before going live.
240
+ task: preview_creative
241
+ schema_ref: "creative/preview-creative-request.json"
242
+ response_schema_ref: "creative/preview-creative-response.json"
243
+ doc_ref: "/creative/task-reference/preview_creative"
244
+ comply_scenario: creative_flow
245
+ stateful: true
246
+ expected: |
247
+ Return a preview of the display creative:
248
+ - preview_url: rendered preview the buyer can inspect
249
+ - render_dimensions: matches the 300x250 format
250
+ - status: preview available
251
+
252
+ sample_request:
253
+ creative_id: "display_trail_pro_300x250"
254
+
255
+ validations:
256
+ - check: response_schema
257
+ description: "Response matches preview-creative-response.json schema"
258
+
259
+ - id: build_video_tag
260
+ title: "Build a VAST tag for the video creative"
261
+ narrative: |
262
+ The buyer builds a serving tag for the video creative. The platform produces
263
+ a VAST-compatible tag that the buyer can traffic to ad servers.
264
+ task: build_creative
265
+ schema_ref: "creative/build-creative-request.json"
266
+ response_schema_ref: "creative/build-creative-response.json"
267
+ doc_ref: "/creative/task-reference/build_creative"
268
+ comply_scenario: creative_flow
269
+ stateful: true
270
+ expected: |
271
+ Return a built serving tag for the video creative:
272
+ - tag: VAST-compatible serving tag or URL
273
+ - format: matches the video format
274
+ - creative_id: matches the requested creative
275
+
276
+ sample_request:
277
+ creative_id: "video_30s_trail_pro"
278
+ output_format:
279
+ agent_url: "https://your-platform.example.com"
280
+ id: "vast_30s"
281
+
282
+ validations:
283
+ - check: response_schema
284
+ description: "Response matches build-creative-response.json schema"
@@ -3,14 +3,10 @@ version: "1.0.0"
3
3
  title: "Sales agent with creative capabilities"
4
4
  category: creative_sales_agent
5
5
  summary: "Stateful sales agent that accepts pushed creative assets and renders them in its environment."
6
- platform_types:
7
- - retail_media
8
- - social_platform
9
-
10
6
  track: creative
11
7
  required_tools:
12
8
  - sync_creatives
13
- - list_creative_formats
9
+
14
10
  narrative: |
15
11
  You run a publisher platform, retail media network, or other sell-side system that
16
12
  accepts creative assets from buyers. The buyer pushes assets or catalog items to your
@@ -165,5 +161,5 @@ phases:
165
161
  - check: response_schema
166
162
  description: "Response matches preview-creative-response.json schema"
167
163
  - check: field_present
168
- path: "previews[0].renders[0].url"
164
+ path: "previews[0].renders[0].preview_url"
169
165
  description: "Preview includes a renderable URL"
@@ -3,14 +3,10 @@ version: "1.0.0"
3
3
  title: "Creative template and transformation agent"
4
4
  category: creative_template
5
5
  summary: "Stateless creative agent that takes assets in, applies templates, and produces tags or rendered output."
6
- platform_types:
7
- - creative_transformer
8
- - creative_library
9
-
10
6
  track: creative
11
7
  required_tools:
12
8
  - build_creative
13
- - list_creative_formats
9
+
14
10
  narrative: |
15
11
  You build a creative management or rich media platform — think Celtra, a format
16
12
  conversion service, or any tool that defines ad templates and transforms input assets
@@ -122,6 +118,7 @@ phases:
122
118
  description: "Response matches schema"
123
119
  - check: field_value
124
120
  path: "formats[*].type"
121
+ value: "display"
125
122
  description: "All returned formats are display type"
126
123
 
127
124
  - id: preview
@@ -186,7 +183,7 @@ phases:
186
183
  - check: response_schema
187
184
  description: "Response matches preview-creative-response.json schema"
188
185
  - check: field_present
189
- path: "previews[0].renders[0].url"
186
+ path: "previews[0].renders[0].preview_url"
190
187
  description: "Preview includes a renderable URL"
191
188
 
192
189
  - id: build