feat(schema): add vast_tracker + daast_tracker asset types (#2915)#3051
Draft
feat(schema): add vast_tracker + daast_tracker asset types (#2915)#3051
Conversation
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>
2 tasks
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>
BaiyuScope3
reviewed
Apr 27, 2026
| **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. |
Collaborator
There was a problem hiding this comment.
VAST doesn't allow negative time offset isn't it ?
https://github.com/InteractiveAdvertisingBureau/vast/blob/aa253bca47951088c90963633e08a6012f1a3940/vast_4.2.xsd#L146
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Closes #2915. Implements Option B + Option B from the triage:
vast_trackeranddaast_trackeras discriminated-union members alongsidevastanddaast, not enum extensions onurl-asset-type. Keeps theasset_typediscriminator as the single branch source for sales agents (nourl_type+vast_eventtwo-field coupling). Matches the existingvast/daast/webhookpattern.<Impression>vs<TrackingEvents>URL split (impression stays onurlasset withurl_type: "tracker_pixel"; only tracking-events URLs becomevast_tracker).What's in the diff
static/schemas/source/core/assets/vast-tracker-asset.json— new schemastatic/schemas/source/core/assets/daast-tracker-asset.json— new schemastatic/schemas/source/creative/asset-types/index.json— registry entriesdocs/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 calloutNon-breaking justification
New asset types only. Existing
vast,daast, andurlconsumers are unaffected. Creative manifests MAY adoptvast_trackerincrementally. No field removals, no required-ness changes on existing schemas.Deferred (out of scope for this PR)
{{CREATIVE_ID}}and similar remain covered by the existing universal-macros doc; no manifest-level declaration.Pre-PR review
<TrackingEvents>scope is normative.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🤖 Generated with Claude Code