Skip to content

feat(schema): add produced_by to format.assets[] to distinguish input/output slots#4023

Draft
bokelley wants to merge 1 commit intomainfrom
claude/issue-4021-format-assets-produced-by
Draft

feat(schema): add produced_by to format.assets[] to distinguish input/output slots#4023
bokelley wants to merge 1 commit intomainfrom
claude/issue-4021-format-assets-produced-by

Conversation

@bokelley
Copy link
Copy Markdown
Contributor

@bokelley bokelley commented May 3, 2026

Closes #4021

Summary

Adds optional produced_by: enum ["buyer", "build_creative"] with default "buyer" to both baseIndividualAsset and baseGroupAsset in static/schemas/source/core/format.json.

This resolves a conformance ambiguity where creative adapters had to declare output slots (assets the build_creative agent generates, not the buyer) using required: false — the only legal expression available in 3.0.x. Buyer agents reading produced_by: "build_creative" on a slot now know they MUST NOT supply it in build_creative input requests; agents receiving such a slot in input MUST return an error.

The change covers both baseIndividualAsset (individual asset slots) and baseGroupAsset (slots within repeatable groups). An if/then constraint is added to both defs to enforce required: false when produced_by: "build_creative", preventing the undefined required: true + build_creative state. default: false is also added to baseIndividualAsset.required for symmetry with baseGroupAsset.

render_time (for impression-serving-time DCO assets) is intentionally deferred — there is no current AdCP task boundary for that lifecycle phase.

Non-breaking justification

Adds optional fields (produced_by) with backward-compatible defaults ("buyer"). All existing format.assets[] declarations that omit produced_by are treated as produced_by: "buyer" by consumers — no existing format or manifest changes required. The if/then constraint only fires when produced_by is explicitly set to "build_creative", which is new usage.

Nits (not fixed)

  • The normative "MUST NOT / MUST reject" language lives in the description string, which JSON Schema validators do not enforce. Enforcement is delegated to the adapter validation layer (consistent with how build_creative error handling works today). A follow-up issue should add a distinct OUTPUT_ONLY_ASSET_PROVIDED error code to build_creative's error table for unambiguous implementation guidance.

Pre-PR review

  • code-reviewer: approved — JSON Schema Draft-07 valid, if/then pattern matches existing parameters_from_format_id/dimensions precedent in the same file, default: false symmetry resolved. Nit: normative language in description is unenforced by validators (acknowledged above).
  • ad-tech-protocol-expert: approved — produced_by enum maps to OpenRTB 2.6 §3.2.7 and Native 1.2 §4.2 named-role precedent; if/then constraint prevents undefined dual-boolean state; minor changeset bump confirmed correct. Nit: description wording for MUST-subject (acknowledged above).

Triage-managed PR. This bot does not currently iterate on
review comments or PR conversation threads (only on the source
issue). To unblock:

  • Push fixup commits directly: gh pr checkout <num>
    fix → push.
  • Or re-trigger: comment /triage execute on the source
    issue.

See #3121
for context.

Session: https://claude.ai/code/${CLAUDE_CODE_REMOTE_SESSION_ID}


Generated by Claude Code

…/output slots

Adds optional `produced_by: enum ["buyer", "build_creative"]` with default
"buyer" to both baseIndividualAsset and baseGroupAsset in format.json.

- produced_by: 'buyer' (default) — buyer provides asset in build_creative inputs
- produced_by: 'build_creative' — agent generates asset in the response;
  buyers MUST NOT include it in requests

Adds if/then constraint enforcing required: false when produced_by is
'build_creative', preventing the undefined required: true + build_creative
state. Adds default: false to baseIndividualAsset.required for symmetry
with baseGroupAsset.

Resolves conformance ambiguity in adapters that declared output slots using
required: false (the only legal option in 3.0.x). render_time deferred.

Closes #4021

https://claude.ai/code/${CLAUDE_CODE_REMOTE_SESSION_ID}
@bokelley bokelley added the claude-triaged Issue has been triaged by the Claude Code triage routine. Remove to re-triage. label May 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

claude-triaged Issue has been triaged by the Claude Code triage routine. Remove to re-triage.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

format.assets[]: distinguish input slots (buyer-provided) from output slots (build_creative-produced)

2 participants