Skip to content

feat: broadcast TV support for 3.0#2046

Merged
bokelley merged 18 commits into
mainfrom
bokelley/broadcast-creative-reqs
Apr 14, 2026
Merged

feat: broadcast TV support for 3.0#2046
bokelley merged 18 commits into
mainfrom
bokelley/broadcast-creative-reqs

Conversation

@bokelley

@bokelley bokelley commented Apr 10, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds broadcast/linear TV support to the protocol and strengthens creative format validation across all channels. Based on feedback from Greg at O-N-X about real broadcast buying workflows.

Broadcast protocol support

Structured video requirements

  • Extend video-asset-requirements.json with 12 fields: GOP structure, scan type, moov atom, audio codecs/channels/loudness, ProRes codec
  • Align all reference format requirement field names to match schema (acceptable_formatscontainers, duration_secondsmin/max_duration_ms, etc.)

Documentation

  • Broadcast TV channel docs (docs/creative/channels/broadcast.mdx)
  • Media-buy docs: broadcast brief example, measurement terms with measurement_window, vendor identity (VideoAmp/Comscore), measurement windows section in optimization-reporting, data freshness note in delivery reporting
  • Testable JSON snippets: 20 new validated examples across broadcast (1), CTV (2), and video (17) channel docs — total validated blocks 219→239

Storyboard

  • Broadcast seller storyboard (media_buy_broadcast_seller.yaml) — 5 phases: product discovery → buy with estimate number → creative sync with Ad-ID → delivery with measurement windows → reconciliation

MCP tool parity

  • agency_estimate_number added to create_media_buy MCP tool definition

Parent epic: #1919

Test plan

  • npm run build:schemas — schemas compile (463 schemas, 81 bundled)
  • npm run test:schemas — 7/7 schema validation tests pass
  • npm run test:json-schema — 239/239 doc JSON examples validate
  • npm run test:unit — 563/563 unit tests pass (including schema drift detection)
  • npm run typecheck — TypeScript compilation clean
  • Mintlify link checker — no broken links
  • Code review — 3 rounds, all must-fix and should-fix addressed
  • Security review — 2 rounds, clean
  • Verify broadcast.mdx renders correctly on docs site

🤖 Generated with Claude Code

bokelley and others added 2 commits April 9, 2026 20:05
…easurement windows

Add foundational broadcast/linear TV support to prevent ext divergence before 3.0.
Closes #2036, #2037, #2038, #2039.

- Ad-ID industry identifiers on creative assets and manifests (shared industry-identifier.json schema)
- Broadcast spot reference formats (15s, 30s, 60s) — video only, no VAST/trackers
- Agency estimate number on media buys and packages (with MCP tool parity)
- Measurement maturation windows (Live/C3/C7) on reporting capabilities
- Measurement window reference on billing measurement terms
- Broadcast TV channel documentation and docs.json navigation
- maxLength constraints on all new string fields

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Update format count assertions from 54 to 57 and add broadcast_spot_15s,
broadcast_spot_30s, broadcast_spot_60s to expected format categories.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
bokelley and others added 5 commits April 9, 2026 20:52
- Add broadcast TV brief example to example-briefs.mdx
- Add broadcast measurement terms example to accountability.mdx (measurement_window, agency_estimate_number)
- Add broadcast measurement vendors (VideoAmp, Comscore) to vendor identity list
- Add broadcast measurement windows section to optimization-reporting.mdx
- Add broadcast data freshness note to get_media_buy_delivery.mdx
- Add broadcast seller storyboard (product discovery → buy → creative sync → delivery → reconciliation)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Move measurement_terms into packages with correct billing_measurement nesting
- Use brand-ref object for vendor (domain: videoamp.com) instead of bare string
- Convert assets from array to object-keyed format matching creative-asset schema
- Use VideoAmp consistently as measurement vendor (matches example brief)
- Fix expected_delay_minutes guidance in optimization-reporting
- Fix cross-references in get_media_buy_delivery (point to accountability and reporting)
- Align example brief budget to $400K matching storyboard packages

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…hema

The video-asset-requirements schema was missing fields for GOP structure,
scan type, moov atom, audio codecs, loudness, and other broadcast/CTV-critical
constraints. Reference formats and docs used invented field names that didn't
match the schema, making mechanical validation impossible.

- Extend video-asset-requirements.json with 12 new structured fields
- Rename all reference format requirements to match schema field names
  (acceptable_formats→containers, acceptable_codecs→codecs, duration_seconds→
  min/max_duration_ms, min_bitrate_mbps→min_bitrate_kbps, etc.)
- Update broadcast.mdx, ctv.mdx, and video.mdx format examples to match

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add $schema annotations to format definition examples in broadcast.mdx
(1 snippet) and ctv.mdx (2 snippets) so they are validated by
test:json-schema against format.json.

Also update video.mdx requirement field names to match the schema
(containers, codecs, min_duration_ms, etc.) for consistency, though
video.mdx examples are not yet testable due to pre-existing gaps in
their asset definitions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fix all video.mdx format and manifest examples to pass schema validation:
- Add name field and $schema to all 12 format definitions
- Add $schema to all 5 manifest examples
- Add item_type/required to all format assets
- Fix requirement field names to match video-asset-requirements schema
- Replace macro URLs with .example URIs for URI format validation
- Add prores to video codecs enum (used by Roku/Hulu CTV formats)

Validated block count: 219 → 239 (+20 new testable snippets)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
bokelley and others added 9 commits April 9, 2026 22:04
… tests

Change category from media_buy_seller to media_buy_broadcast_seller so
listStoryboards('media_buy_seller') returns only the base seller storyboard.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… tests

Fix expected_delay_minutes from 21600 (15 days) to 1440 (24 hours) in
broadcast.mdx reporting_capabilities example. This field represents
initial data availability (live overnight ratings), not C7 maturation.
Per-window timelines use expected_availability_days instead.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ker transparency

Three changes to close protocol gaps identified during broadcast review:

1. Add is_final and measurement_window to by_package in delivery response.
   Buyers now know whether delivery data is provisional or closed, and which
   measurement window it represents. Works for any channel with data that
   matures (broadcast C3/C7, podcast download windows, IVT filtering stages).

2. Document third-party tracker support inference from format definitions.
   If a format has no impression_tracker asset slot, third-party measurement
   pixels cannot be attached. Broadcast formats are the clearest example.

3. Remove supported_macros from broadcast reference formats (no runtime
   macro expansion on pre-rendered spot files). Drop lsd from standard
   measurement window examples (Nielsen-internal, rarely surfaces in buying).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Move tracker transparency from broadcast-only doc to core format
documentation (formats.mdx) and creative enforcement section
(accountability.mdx). Buyer agents need to check format assets for
tracker slots before proposing performance standards that require
creative-level verification — this applies across all channels, not
just broadcast.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Map each step to existing comply scenarios so the storyboard can run
against the automated test harness: full_sales_flow, create_media_buy,
media_buy_lifecycle, creative_lifecycle, creative_sync, reporting_flow.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Both code review and security review flagged that audio_codecs items
were bare strings with no enum, inconsistent with other array fields
in the schema (codecs, audio_channels, containers all use enums).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ents, tracker transparency

Add what's-new section for the rc.3 release covering:
- Broadcast TV support (Ad-ID, measurement windows, spot formats, agency estimate number)
- Delivery data completeness (is_final, measurement_window on packages)
- Structured video requirements (schema-aligned field names)
- Third-party tracker transparency (format-level inference)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…rement progression

Add window_update to delivery notification_type enum — distinct from adjusted
(correction within same window). window_update signals planned measurement
progression: C3 superseding live, C7 superseding C3.

Add supersedes_window field on per-package delivery data to indicate which
prior window's data is being replaced.

Full lifecycle example in optimization-reporting.mdx showing the three-stage
progression (live → C3 → C7) with actual JSON payloads. Updated broadcast
storyboard delivery and reconciliation steps to reference these fields.

Closes #2040.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
bokelley and others added 2 commits April 12, 2026 09:09
Storyboards are loaded from @adcp/client at runtime, not from docs/storyboards/.
All storyboard changes (broadcast seller, generative, bug fixes) moved to
adcontextprotocol/adcp-client#499 for proper sync.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…eative-reqs

# Conflicts:
#	docs/storyboards/campaign_governance_conditions.yaml
#	docs/storyboards/campaign_governance_delivery.yaml
#	docs/storyboards/campaign_governance_denied.yaml
#	docs/storyboards/creative_sales_agent.yaml
#	docs/storyboards/creative_template.yaml
#	docs/storyboards/media_buy_catalog_creative.yaml
#	docs/storyboards/media_buy_governance_escalation.yaml
#	docs/storyboards/media_buy_guaranteed_approval.yaml
#	docs/storyboards/media_buy_non_guaranteed.yaml
#	docs/storyboards/media_buy_proposal_mode.yaml
#	docs/storyboards/media_buy_seller.yaml
#	docs/storyboards/media_buy_state_machine.yaml
#	docs/storyboards/schema.yaml
#	docs/storyboards/signal_marketplace.yaml
#	docs/storyboards/signal_owned.yaml
@bokelley bokelley merged commit 63dba34 into main Apr 14, 2026
16 of 17 checks passed
bokelley pushed a commit that referenced this pull request May 14, 2026
)

Close IACET Element 5 gap in A1 by noting C3/C7 measurement windows in the 20-channels bullet. Add broadcast delivery reporting to S1 "What you'll demonstrate" and extend lab exercise 8 to cover get_media_buy_delivery window interpretation. Add broadcast measurement window scenario to B3 exercises. Renumber migration from 423 (conflict on main) to 466. Depends on broadcast TV protocol PR #2046 (merged 2026-04-14).

Closes #2047

https://claude.ai/code/session_01QyYuKotWrS4sqbuHRLktjX
bokelley added a commit that referenced this pull request May 14, 2026
)

* docs(certification): broadcast TV training content for A1, S1, B3 (#2047)

Close IACET Element 5 gap in A1 by noting C3/C7 measurement windows in the 20-channels bullet. Add broadcast delivery reporting to S1 "What you'll demonstrate" and extend lab exercise 8 to cover get_media_buy_delivery window interpretation. Add broadcast measurement window scenario to B3 exercises. Renumber migration from 423 (conflict on main) to 466. Depends on broadcast TV protocol PR #2046 (merged 2026-04-14).

Closes #2047

https://claude.ai/code/session_01QyYuKotWrS4sqbuHRLktjX

* chore(migration): renumber 466_broadcast_delivery_criteria → 477

Slot 466 was claimed by 466_adcp_state.sql while this branch was sitting.
Next free slot at rebase time is 477. SQL contents unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant