Skip to content

feat(schema): add vast_tracker + daast_tracker asset types (#2915)#3051

Draft
bokelley wants to merge 4 commits intomainfrom
claude/issue-2915-vast-tracker-assets
Draft

feat(schema): add vast_tracker + daast_tracker asset types (#2915)#3051
bokelley wants to merge 4 commits intomainfrom
claude/issue-2915-vast-tracker-assets

Conversation

@bokelley
Copy link
Copy Markdown
Contributor

Summary

Closes #2915. Implements Option B + Option B from the triage:

  1. Dedicated asset typesvast_tracker and daast_tracker as discriminated-union members alongside vast and daast, not enum extensions on url-asset-type. Keeps the asset_type discriminator as the single branch source for sales agents (no url_type + vast_event two-field coupling). Matches the existing vast/daast/webhook pattern.
  2. Normative creative/sales boundary — docs now codify wrapper ownership (sales agent wraps; creative agent never does) and the <Impression> vs <TrackingEvents> URL split (impression stays on url asset with url_type: "tracker_pixel"; only tracking-events URLs become vast_tracker).

What's in the diff

  • static/schemas/source/core/assets/vast-tracker-asset.json — new schema
  • static/schemas/source/core/assets/daast-tracker-asset.json — new schema
  • static/schemas/source/creative/asset-types/index.json — registry entries
  • docs/creative/asset-types.mdx — two new subsections (VAST Tracker Asset, DAAST Tracker Asset) + a "Creative / Sales Agent Boundary (VAST Assembly)" section with the three normative rules and the SSAI known-gap callout

Non-breaking justification

New asset types only. Existing vast, daast, and url consumers are unaffected. Creative manifests MAY adopt vast_tracker incrementally. No field removals, no required-ness changes on existing schemas.

Deferred (out of scope for this PR)

  • SSAI manifest shape — mentioned in the docs as a known gap requiring a follow-on RFC (Yospace/MediaTailor rewrite VAST before it reaches the player; trackers must be in the XML pre-stitch).
  • Macro declaration{{CREATIVE_ID}} and similar remain covered by the existing universal-macros doc; no manifest-level declaration.

Pre-PR review

  • ad-tech-protocol-expert (triage phase): approved — dedicated type matches AdCP's discriminated-union pattern, impression/events split is explicit, <TrackingEvents> scope is normative.
  • adtech-product-expert (triage phase): approved — wrapper-ownership rule matches Innovid / Extreme Reach / GAM / FreeWheel operator reality; complete-tag path (existing vast-asset.json) preserved for the agency hosted-tag workflow.

Test plan

  • npm run test:schemas — all 7 schema validation suites pass (487 schemas)
  • npm run build:schemas — clean build
  • CI green
  • Mintlify broken-links check (local pre-push hook is broken on this repo per earlier triage — CI is the authoritative check)

🤖 Generated with Claude Code

bokelley and others added 4 commits April 24, 2026 13:58
Implements Option B + Option B from the #2915 triage:

1. Dedicated asset types. Adds vast-tracker-asset.json and
   daast-tracker-asset.json as discriminated union members rather
   than extending the existing url-asset enum. The asset_type
   discriminator stays the single source of branching for sales
   agents — no two-field (url_type + vast_event) coupling.

2. Normative creative/sales boundary. Docs codify that:
   - The sales agent owns VAST <Wrapper> construction; the
     creative agent MUST NOT emit pre-wrapped VAST.
   - <Impression> URLs stay on url asset with
     url_type: 'tracker_pixel'. A vast_tracker MUST NOT have
     vast_event: 'impression' — that event lives in <Impression>,
     not <TrackingEvents>.
   - Complete-tag and decomposed-tracker shapes MAY be mixed; the
     sales agent merges them into one VAST document at serve time.

3. SSAI gap explicitly called out as a known follow-on RFC topic.

Non-breaking: new asset types only. Schema validation tests pass.

Closes #2915

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Mintlify's broken-links preview crashes with "Invalid hook call /
Cannot read properties of null (reading 'useState')" when it hits
bare capitalized angle-bracket tokens like <TrackingEvents> even
inside inline code spans. Existing docs avoid the pattern entirely —
they write "TrackingEvents" (no brackets) or VAST XML inside a
fenced `json` block.

Strips `<Word>` → `Word` inside inline code in the three schema
descriptions I added today plus the asset-types.mdx prose. Actual
VAST XML in fenced JSON examples is unaffected.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Mintlify broken-links resolves internal links through its React-based
navigation; an unmatched route cascades into an "Invalid hook call"
React crash and non-zero exit. Every other doc in this repo that
references universal-macros uses the /docs/ prefix
(agentic-execution-engine.mdx, key-concepts.mdx, dooh.mdx, etc.). My
new link was missing the prefix.

Reproduced locally — with the prefix mintlify returns exit 0; without
it, exit 1 and the React stack trace seen in CI.

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

Addresses protocol-expert review blockers on #3051:

1. vast_event/daast_event now use allOf + not:{enum:[...]} to hard-
   fail impression, clickTracking, customClick, error. Was prose-only
   before. Makes the routing rule schema-checkable.
2. offset pattern now matches VAST 4.x XSD: HH:MM:SS with optional
   exactly-3-digit fractional, negative allowed (from end of ad);
   percentage 0-100 only. Was permitting HH:MM:SS.X and 999%.
3. Rewrote "Wrapper ownership" normative rule: prohibits <Wrapper>
   (multi-hop chain construct) specifically, not inline VAST. The
   previous wording conflicted with the existing inline-VAST example
   at universal-macros.mdx which shows Ad>InLine>Creatives content —
   that pattern remains valid.
4. Added "Tracker routing by element" rule — VAST's tracker URLs
   live in three elements (Impression, TrackingEvents, VideoClicks)
   and AdCP maps them to three asset shapes. Don't cross the streams.
5. Noted OMID/AdVerifications decomposition as planned follow-up.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@bokelley bokelley added this to the 3.1.0 milestone Apr 24, 2026
bokelley added a commit that referenced this pull request Apr 24, 2026
…es to release branch (#3056)

Old rule was too conservative: "only milestone on explicit signal,
never create milestones, never infer." Result: minor-bump PRs (like
#3051 for 3.1.0) shipped unmilestoned and had to be edited manually.

New rule: the changeset bump level is explicit signal. Fetch open
milestones + patch branches via gh api, then apply the routing
matrix — major → next-major milestone on main; minor → next-minor
milestone (e.g. 3.1.0) on main; patch → patch milestone on X.Y.x
branch (flag-for-human if no patch branch exists); --empty → no
milestone, main.

Still never creates milestones — if the expected one is missing,
flag-for-human. Matches the repo invariant: milestones are a human
planning surface, branches are a human release-cut decision.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
**Properties:**
- `vast_event`: The event this URL fires on. Any VAST tracking-event enum value **except** `impression`, `clickTracking`, `customClick`, and `error` — those live in other VAST elements (see Tracker routing normative rule below). Common values: `start`, `firstQuartile`, `midpoint`, `thirdQuartile`, `complete`, `pause`, `resume`, `mute`, `unmute`, `skip`, `viewableImpression`.
- `url`: Tracker URL. Supports [AdCP universal macros](/docs/creative/universal-macros).
- `offset`: Required for `vast_event: "progress"`. VAST 4.x offset format: `HH:MM:SS` or `HH:MM:SS.mmm` (exactly 3 fractional digits) for absolute time, or an integer percentage 0–100 suffixed with `%`. Negative time offsets (measured from end of ad) are allowed per VAST 4.x.
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

RFC: VAST Assembly: Tracker URLs as Assets and Creative/Sales Agent Boundary

2 participants