Online ResourcesPrashant Chaudhary

Do Open-Source Video Ad Clients Follow VAST 4.3? An Empirical Study of Player Conformance

Online Resource 5: Full results

Online Resource 5 to "Do Open-Source Video Ad Clients Follow VAST 4.3? An Empirical Study of Player Conformance" (Prashant Chaudhary, October 2026). This document holds the results that are too long for the paper: the requirement catalog with the obligation sentence behind every requirement, the full macro grid split by macro set, pointers to two generated views that list every verdict, once by client and once by duty group, with the oracle detail of each deviating cell, and the sensitivity of the must-level counts to strength labels for each configuration. Paths are relative to the root of the replication repository. Nothing here was rerun; each part is copied from the file named at its head, with section signs written as "Sec." and typographic quotation marks as plain ones.

1. The requirement catalog with the obligation sentence behind every requirement

Source: generated from code/harness/suite/requirements.mjs, the VAST 4.3 text (sources/iab-vast-spec/VAST4.x/4.3.md) and the IAB macro list (sources/iab-vast-spec/vast/vast4macros/data/macros-data.json, commit 99d5d51); both are fetched and hash-checked by code/tools/fetch-sources.sh and are not stored in the replication package. Rows are sorted by ID in the order W, E, T, M, X, P, A, I, S, R, then by number. Appendix A of the paper gives the same requirements with their basis and literal modal; this table adds the sentence of the specification that carries each duty.

What the catalog records. Each entry has an ID, an area, a section reference, a strength, a duty and a one-line claim in the author's words. It records no sentence from the specification. Every obligation sentence below was therefore located in the VAST 4.3 text (or the macro list) for this table and is marked "located"; the generating script checks that each quoted fragment occurs verbatim on the cited line. "Where" is the line number in sources/iab-vast-spec/VAST4.x/4.3.md.

Literal modal. must, should or may as written; "required" where the text says "required" or "is required to" (treated as must); "imperative" for an instruction with no modal verb; "descriptive" for a definition or statement with no modal; "macro-list-required" where the only basis is the macro list's support label "Required"; "none" for robustness observations, which are not VAST clauses. Where several sentences are cited, the modal is the one that carries the graded duty (the note says which).

Flag. "differs" where the graded strength is not the literal modal (must against must or required; should against should; may against may; observation against none).

Catalog strengths: must 58, should 39, may 2, observation 9. Literal modals: must 32, required 22, should 22, descriptive 16, none 8, macro-list-required 5, may 2, imperative 1.

1.1 All 108 requirements

Table R5.1. All 108 requirements

showing 108 of 108CSV
W01wrappersSec. 2.2; Sec. 2.3.5Follows a Wrapper to its InLine ad."VAST-compliant media players and SSAI systems must be able to play the ad in a VAST response" / "including those of any subsequent ad servers called in a chain of VAST Wrapper responses"line 470; line 472locatedmustmust
W02wrappersSec. 2.2; The Ad Element (sequence); Ad PodsFollows a lone Wrapper that carries sequence="1" (a one-ad pod) to its InLine ad, or declines it with an error (pod support is optional)."must be able to play the ad in a VAST response" / "Required (Ad Pod support is optional)"line 470; line 975locatedmustmust
W03wrappersSec. 3.19.1Accepts a chain of five Wrappers before the InLine ad (players are required to accept five)."In VAST 4 the player is only required to accept five wrappers ads."line 2258locatedrequiredmust
W04wrappersSec. 2.3.5.1; Sec. 3.19.1With six Wrappers the player may reject; if it does, it determines 302 (and, with a tracker, reports it to the Error URI of every Wrapper it received)."the player may reject any subsequent responses in the chain" / "Error codes should be sent for all wrappers in the chain where provided."line 691; line 691locatedshouldshould
W05wrappersSec. 2.3.5.1Terminates a Wrapper that points to itself (stops requesting it)."an infinite loop is possible where a chain of Wrappers never results in a final InLine VAST response" / "the player may reject any subsequent responses in the chain"line 688; line 691locateddescriptiveshoulddiffers
W06wrappersSec. 2.3.5.1; Error Reporting table (302)Reports 302 (wrapper limit) for a self-referencing Wrapper loop."Error codes should be sent for all wrappers in the chain where provided." / "Wrapper limit reached, as defined by the media player."line 691; line 754locatedshouldshould
W07wrappersError Reporting (Media Player Details; table 301)When the VASTAdTagURI is unavailable (HTTP 404), determines error 301."If an error occurs while trying to load an Ad and the <Error> element is provided, the media" / "Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "URI was either unavailable or reached a timeout"line 730; line 733; line 753locatedmustmust
W08wrappersError Reporting (table 301)When the VASTAdTagURI times out, determines error 301."Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "Timeout of VAST URI provided in Wrapper element"line 733; line 753locatedmustmust
W09wrappersError Reporting (No Ad Response); Error (VAST)When a Wrapper leads to a no-ad response and the player determines a code, the code is 303."If an [ERRORCODE] macro is included, the media player should substitute with error code 303."line 793locatedshouldshould
W10wrappersSec. 3.2.1 Error (VAST); Error Reporting (No Ad Response)Requests the VAST-level Error URI of a no-ad response reached through a Wrapper (with 303 for [ERRORCODE])."the media player must send a request to the URI provided when the VAST response returns an empty InLine response after a chain of one or more wrappers"line 793locatedmustmust
W11wrappersError Reporting (table 100); Sec. 2.3.2 (well-formed XML)When the Wrapper target is not well-formed XML, determines error 100 (and does not use an ad from it)."Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "XML parsing error." / "every attempt should be made to provide an error code that maps to the error that occurred"line 733; line 742; line 1176locatedmustmust
W12wrappersError Reporting (Media Player Details)Requests the Wrapper Error URI when its VASTAdTagURI fails."Request the error source file using the URI provided." / "the media player must also return error details as listed above for each Wrapper response"line 732; line 735locatedmustmust
W13wrappersError Reporting (Media Player Details); Sec. 3.4.11An InLine error after a chain of Wrappers is reported to the InLine and to every Wrapper Error URI, with the same code (403 here)."the media player must also return error details as listed above for each Wrapper response" / "will produce an error for each of the Wrappers used to serve the Inline Ad"line 735; line 712locatedmustmust
W14wrappersSec. 3.4.4; Sec. 2.3.4At impression time, requests the Impression URIs of the InLine ad and of every Wrapper before it."the media player is required to request all impressions at the same time or as close as possible to the same time" / "should be triggered at the same time when the impression for the ad occurs"line 669; line 1052locatedrequiredmust
W15wrappersSec. 3.19 (tracking elements in Wrappers)Fires the Wrapper's Linear tracking events (start, quartiles, complete) together with the InLine ones."The media player is required to request the resource file for any included tracking elements" / "the Wrapper may contain tracking elements that provide tracking for the InLine ad"line 663; line 2240locatedrequiredmust
W16wrappersSec. 2.3.5.2When both the InLine and a Wrapper carry a ClickThrough, the InLine one is used."if the inLine response includes a ClickThrough element then this must be favored over ClickThrough element(s) specified in calling Wrappers"line 703locatedmustmust
W17wrappersSec. 2.3.5.2When the InLine has no ClickThrough (no VideoClicks), the ClickThrough of the Wrapper closest to the InLine is used."then the ClickThrough element closest to the InLine response must be favored"line 703locatedmustmust
W18wrappersSec. 3.10.2 ClickTracking; Sec. 3.19On a click, requests the ClickTracking URIs of the InLine and of every Wrapper."The media player is required to request the resource file for any included tracking elements"line 663locatedrequiredmust
W19wrappersSec. 3.19 (followAdditionalWrappers)With followAdditionalWrappers="false", a Wrapper received next is ignored rather than followed."If false, any Wrappers received (i.e. not an Inline VAST response) should be ignored."line 2251locatedshouldshould
W20wrappersSec. 3.19 (allowMultipleAds)With allowMultipleAds="false", only the first stand-alone Ad of the response is used (pod ads are dropped)."If false, only the first stand-alone Ad (with no sequence values) in the requested VAST response is allowed."line 2251locateddescriptiveshoulddiffers
W21wrappersSec. 3.19 (allowMultipleAds default false)Without the attribute, allowMultipleAds defaults to false, so only the first stand-alone Ad is used."Default value is “false.”"line 2251locateddescriptiveshoulddiffers
W22wrappersSec. 3.19.2 BlockedAdCategoriesOptional: rejects an InLine whose Category is blocked upstream; a player that does reject it must report 205."can also be used by the player to reject InLine ads" / "the client must notify the ad server using the <Error> URI, if provided (error code 205)"line 2270; line 2270locatedmaymay
E01errorsSec. 3.2.1 Error (VAST)For a no-ad response, requests the VAST-level Error URI."the media player must use the URI provided to notify the server that no ad was returned"line 932locatedmustmust
E02errorsSec. 3.2.1 Error (VAST), bounded 0+Requests every VAST-level Error URI when several are given."the media player must use the URI provided" / "Multiple <Error> elements may be provided to notify multiple parties"line 932; line 932locatedmustmust
E03errorsSec. 3.4.11; Error Reporting (table 403)With no supported MediaFile, requests every InLine Error URI with 403."Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "Couldn’t find MediaFile that is supported by this media player"line 733; line 760locatedmustmust
E04errorsError Reporting (Media Player Details); macro list ERRORCODEReplaces [ERRORCODE] in Error URIs with a numeric code."Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "the media player must populate the macro with an error code"line 733; line 1174locatedmustmust
T01trackingSec. 2.3.4; Sec. 3.4.4Requests every Impression URI of the ad."The media player is required to request the resource file for any included tracking elements" / "the media player must use to notify the ad server when the impression occurs"line 663; line 1060locatedrequiredmust
T02trackingSec. 3.4.4 (about:blank)Does not dispatch an Impression whose URI is about:blank."The player should disregard dispatching the tracking URI if it is set to "about:blank""line 1060locatedshouldshould
T03trackingSec. 3.14.1 (Linear metrics)Fires start, firstQuartile, midpoint, thirdQuartile and complete exactly once each, in that order."the media player is required to trigger the tracking resource URI provided in the nested <Tracking> element" / "firstQuartile: The creative played continuously for at least 25%"line 1972; line 1948locatedrequiredmust
T04trackingSec. 3.14.3 (multiple Tracking elements per event)Fires every Tracking element for the same event (two start trackers for two parties)."the media player is required to trigger the tracking resource URI" / "may also be used to track events of the same type for multiple parties"line 1972; line 1984locatedrequiredmust
T05trackingSec. 3.14.1 (progress, HH:MM:SS offset)Fires a progress tracker with an HH:MM:SS offset."the media player is required to trigger the tracking resource URI" / "Values can be time in the format HH:MM:SS or HH:MM:SS.mmm or a percentage value in the format n%."line 1972; line 1953locatedrequiredmust
T06trackingSec. 3.14.1 (progress, HH:MM:SS.mmm offset)Fires a progress tracker with an HH:MM:SS.mmm offset."the media player is required to trigger the tracking resource URI" / "Values can be time in the format HH:MM:SS or HH:MM:SS.mmm"line 1972; line 1953locatedrequiredmust
T07trackingSec. 3.14.1 (progress, n% offset)Fires progress trackers with percentage offsets (10% and 80%)."the media player is required to trigger the tracking resource URI" / "or a percentage value in the format n%" / "If the duration is not known when the offset is set to a percentage value, the progress event may be ignored."line 1972; line 1953; line 2003locatedrequiredmust
T08trackingSec. 3.14.1 (thirdQuartile, complete definitions)Stopping at 60% fires midpoint but neither thirdQuartile nor complete."the media player is required to trigger the tracking resource URI" / "thirdQuartile: The creative played continuously for at least 75% of the duration at normal speed."line 1972; line 1950locatedrequiredmust
T09trackingSec. 2.3.4; Sec. 3.4.4 (same time)Spread between the first and last Impression request at impression time (ms, measured at the server)."the media player is required to request all impressions at the same time or as close as possible to the same time"line 669locatedrequiredobservationdiffers
M01macrosIAB macro list: CACHEBUSTING (required)Replaces [CACHEBUSTING] with a random 8-digit integer."Required" / "Random 8-digit integer."macro list, CACHEBUSTING; macro list, CACHEBUSTINGlocatedmacro-list-requiredmustdiffers
M02macrosIAB macro list: TIMESTAMP (required)Replaces [TIMESTAMP] with an ISO 8601 date-time (milliseconds and zone as in the macro list example 2016-01-17T8:15:07.127-05)."Required" / "formatting conventions of ISO 8601"macro list, TIMESTAMP; macro list, TIMESTAMPlocatedmacro-list-requiredmustdiffers
M03macrosIAB macro list: LIMITADTRACKING (required)Replaces [LIMITADTRACKING] with 0 or 1 (the harness also accepts -1/-2, since a browser has no device advertising ID; see detail)."Required" / "with “1” indicating that a user has opted for limited ad tracking"macro list, LIMITADTRACKING; macro list, LIMITADTRACKINGlocatedmacro-list-requiredmustdiffers
M04macrosSec. 6.1 (encodeURIComponent on values)Percent-encodes macro values (the colons in TIMESTAMP)."make sure to apply encodeURIComponent to any value" / "the encoded version must always be used as a macro substitution"line 2483; line 2489locatedmustmust
M05macrosSec. 6.1 (do not replace unknown macros with -1)Does not write -1 into a macro it does not know ([NOTAREALMACRO])."do not replace all unknown macros with -1, only do this for macros specifically mentioned in this section"line 2477locatedimperativeshoulddiffers
X01xmlSec. 2.3.3 (whitespace around a CDATA-wrapped URI)Trims the whitespace around a CDATA-wrapped Impression URI before handing it to the network (checked on the client side, since URL parsers also strip it)."<![CDATA[http://ad.server.com/impression/dot.gif]]>" / "Correct and backwards compatible."line 578; line 581locateddescriptiveshoulddiffers
X02xmlSec. 2.2 (XML comments)Ignores XML comments inside an element when reading its URI."must be able to play the ad in a VAST response" / "acknowledge VAST comments in the standard XML syntax"line 470; line 475locatedmustmust
X03xmlSec. 2.3.2 (character entities should be honored)Decodes character entities (&amp;) in a URI given as plain text (a document that breaks Sec. 2.3.3's CDATA rule, which real tags still do)."standard XML requirements such as character entities and <!--XML comments--> should be honored"line 516locatedshouldshould
X04xml(robustness; a 4.x document without the VAST namespace is not schema-valid)Parses a document that omits xmlns="http://www.iab.com/VAST".(no VAST clause)--noneobservation
X05xmlSec. 3.7.1 (UniversalAdId 1+; 4.2 XSD unbounded)Accepts a Creative with two UniversalAdId elements."must be able to play the ad in a VAST response" / "A required element for the purpose of tracking ad creative"line 470; line 1283locatedmustmust
X06xmlSec. 2.2 (play the ad in a VAST response); Sec. 3.9.5 (ClosedCaptionFile 0+)Accepts two ClosedCaptionFile elements."must be able to play the ad in a VAST response"line 470locatedmustmust
P01podsAd Pods and Stand-Alone AdsOrders pod ads by their sequence attribute (document order is 3, 1, 2): the ad with sequence 1 comes first (or the pod is declined with an error; pod support is optional)."the media player must play the ads in the Pod in the prescribed sequence" / "sequenced ads are played in numerical order"line 958; line 948locatedmustmust
R01robustness(engineering; not a VAST clause)A timed-out Wrapper request does not escape as an uncaught exception (which terminates a Node process).(no VAST clause)--noneobservation
R02robustness(engineering; not a VAST clause)A failed Wrapper request does not escape as an uncaught exception.(no VAST clause)--noneobservation
W23wrappersSec. 3.19 (fallbackOnNoAd)With fallbackOnNoAd="true", when the Wrapper's target returns no ad, a stand-alone ad from the response is used."If true, the media player should select from any stand-alone ads available."line 2252locatedshouldshould
E05errorsError Reporting (table 401)When the MediaFile URI returns HTTP 404, requests the InLine Error URI with 401 (file not found)."Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "File not found. Unable to find Linear/MediaFile from URI."line 733; line 758locatedmustmust
E06errorsError Reporting (table 405)When a MediaFile of a supported type cannot be decoded, requests the InLine Error URI with 405."Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "Media player found a MediaFile with supported type but couldn’t display it."line 733; line 761locatedmustmust
E07errorsError Reporting (table 402)When the MediaFile URI answers only after 30 s, requests the InLine Error URI with 402 (media timeout)."Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "Timeout of MediaFile URI."line 733; line 759locatedmustmust
E08errorsSec. 3.4.11 (Error is for ads that cannot be served)Does not request the Error URI when the ad plays without a problem."The <Error> element enables the media player to provide feedback to ad servers when an Ad cannot be served." / "This error-tracking resource is called when the media player is unable to display the Ad."line 707; line 714locateddescriptiveshoulddiffers
E09errorsSec. 2.3.1; Error Reporting (table 200, 201)Given a NonLinear-only ad, either displays it (impression or creativeView) or reports 200/201 (unexpected ad type or linearity)."Replace the [ERRORCODE] macro, if provided, with the appropriate error code" / "Media player received an Ad type that it was not expecting and/or cannot play." / "it can decline from loading the ad resources and use the error URI"line 733; line 745; line 954locatedmustmust
T10trackingSec. 2.3.4 (IAB Digital Video Measurement Guidelines); Sec. 3.4.4Does not request the Impression of an ad whose media never plays (no supported MediaFile)."compliance with the IAB Digital Video Measurement Guidelines" / "when the impression occurs"line 673; line 1060locateddescriptiveshoulddiffers
T11trackingSec. 3.4.4 (notify when the impression occurs); Sec. 2.3.4Requests the Impression exactly once across pause, resume, mute and unmute."the media player must use to notify the ad server when the impression occurs"line 1060locateddescriptiveshoulddiffers
T12trackingSec. 3.14.1 (pause)Fires the pause tracker once when the user pauses."the media player is required to trigger the tracking resource URI" / "pause: the user clicked the pause control and stopped the creative."line 1972; line 1937locatedrequiredmust
T13trackingSec. 3.14.1 (resume)Fires the resume tracker once when the user resumes."the media player is required to trigger the tracking resource URI" / "resume: the user activated the resume control after the creative had been stopped or paused."line 1972; line 1938locatedrequiredmust
T14trackingSec. 3.14.1 (mute)Fires the mute tracker once when the user mutes."the media player is required to trigger the tracking resource URI" / "mute: the user activated the mute control and muted the creative."line 1972; line 1935locatedrequiredmust
T15trackingSec. 3.14.1 (unmute)Fires the unmute tracker when the user unmutes."the media player is required to trigger the tracking resource URI" / "unmute: the user activated the mute control and unmuted the creative."line 1972; line 1936locatedrequiredmust
T23trackingSec. 3.14.1 (unmute: the user unmuted)A volume change that is not an unmute (0.5 while unmuted) does not fire unmute."unmute: the user activated the mute control and unmuted the creative."line 1936locateddescriptiveshoulddiffers
T20trackingSec. 3.14.1 (loaded)Fires the loaded tracker once when the media is ready to play."This event should be used to indicate when the player considers that it has loaded"line 1946locatedshouldshould
T16trackingSec. 2.3.1 (Skippable Linear); Sec. 3.8 skipoffset; Sec. 3.14.1 (skip)Skipping at 6 s (skipoffset 00:00:03) fires skip and neither thirdQuartile nor complete (skippable support is an optional ad type)."the media player is required to trigger the tracking resource URI" / "skip: the user activated a skip control to skip the creative."line 1972; line 1940locatedrequiredmust
T17trackingSec. 3.8 (skipoffset: when skip controls are made available)The skip control is not available at 1.5 s and is available at 6 s (skipoffset 00:00:03)."Time value that identifies when skip controls are made available to the end user"line 1351locateddescriptiveshoulddiffers
T18trackingSec. 3.8 skipoffset; VAST 4.2 XSD (skipoffset pattern allows n%)A percentage skipoffset (30% of 10 s) makes skip available at 3 s, and skipping fires skip."Time value that identifies when skip controls are made available to the end user"line 1351locateddescriptiveshoulddiffers
T19trackingSec. 3.14.3 (progress counts a view even if the ad is skipped)Progress offsets passed before the skip (2 s and 5 s) are fired."When skippable ads are supported, the progress event is used to identify when the ad counts as a view even if the ad is skipped."line 1986locateddescriptiveshoulddiffers
T21trackingSec. 3.14.1 (rewind)Fires the rewind tracker when the user seeks back 2 s (from 60% to 40%)."the media player is required to trigger the tracking resource URI" / "rewind: the user activated the rewind control"line 1972; line 1939locatedrequiredmust
T22trackingSec. 3.14.1 (quartiles: played continuously)After rewinding from 6 s to 4 s, midpoint and the 5 s progress tracker are not fired a second time when playback passes them again."midpoint: The creative played continuously for at least 50% of the total duration at normal speed."line 1949locateddescriptiveshoulddiffers
A01verificationSec. 3.17; Sec. 3.17.4 (verificationNotExecuted)When it does not execute the InLine's verification resource (a JavaScript resource with an apiFramework it does not implement), requests its verificationNotExecuted URI."The player must request each associated verificationNotExecuted tracking event URI" / "any appropriate tracking events listed under the <Verification> element must be fired"line 841; line 2090locatedmustmust
A02verificationSec. 3.17.4 [REASON]; IAB macro list: REASON (required)Fills [REASON] in verificationNotExecuted with a reason code (1, 2 or 3)."with the [REASON] macro filled with reason code 1" / "Required" / "The following macros should be supported specifically in URIs for this event type"line 841; macro list, REASON; line 2164locatedmustmust
A03verificationViewability with Ad Verification Services (resources from intermediary Wrappers)Handles the Wrapper's verification too: requests its verificationNotExecuted URI."All verification resources listed in the VAST should be executed, including those from any intermediary <Wrapper> VASTs"line 839locatedshouldshould
A04verificationSec. 3.17.4 (reason code 2); Sec. 3.17.1; Viewability with Ad Verification ServicesReports a verification resource whose apiFramework it does not implement with reason 2 (verification not supported)."the player must trigger any provided verificationNotExecuted tracking events with reason code 2"line 2109locatedmustmust
A05verificationSec. 3.17.4 (reason code 3: 404 or other failed response codes); Viewability with Ad Verification ServicesWhen an OMID verification resource fails to load (HTTP 404), requests its verificationNotExecuted URI with reason 3 (error during resource load)."any included verificationNotExecuted tracking events URIs must be sent with the appropriate reason code" / "404 or other failed response codes"line 843; line 2171locatedmustmust
S01mediaMediaFiles (choose by attributes, not document order)Skips a MediaFile of an unsupported type listed first (video/x-flv) and plays a supported one."the publisher should decide which file to play based on attributes of the MediaFile nodes and not the structure of the document"line 1391locatedshouldshould
S02mediaSec. 1.4; Sec. 3.4 (adType="audio")Optional: plays an audio ad (adType="audio", Opus WebM and AAC files)."organizations may be compliant with VAST while only supporting a selected subset of the ad types" / "all ad types are relevant for “audio only” ads except NonLinear ads"line 500; line 512locatedmaymay
M06macrosSec. 6.1 (unprovided optional macros must become -1 or -2)Replaces each of eight listed optional macros ([ADPLAYHEAD], [ADSERVINGID], [UNIVERSALADID], [PODSEQUENCE], [ASSETURI], [BREAKPOSITION], [IFA], [CLIENTUA]) with a plausible value or -1/-2; none left as macro or empty."the following special values must be inserted into the macro to indicate the reason for not providing the information"line 2470locatedmustmust
M07macrosSec. 3.4.3 (player fills [ADSERVINGID] from AdServingId)Fills [ADSERVINGID] with the ad's AdServingId (in-serving)."The player is responsible for parsing this value and using it to fill the associated macro (see section 6) on tracking pixels."line 1034locateddescriptiveshoulddiffers
M08macrosIAB macro list: ADPLAYHEAD (HH:MM:SS.mmm)When it fills [ADPLAYHEAD], the midpoint value is HH:MM:SS.mmm and about 5 s."Optional" / "{HH:MM:SS.mmm}"macro list, ADPLAYHEAD; macro list, ADPLAYHEADlocateddescriptiveshoulddiffers
M09macrosSec. 6.1 (Array values: encode each value, commas unencoded); IAB macro list: UNIVERSALADIDFills [UNIVERSALADID] with one or more of the Creative's IDs as "registry value" pairs, each percent-encoded; several IDs are joined by a raw comma."the value should be rendered as a set of values separated by a comma" / "encoding should be applied to individual values only"line 2481; line 2483locatedshouldshould
M10macrosIAB macro list: ASSETURI (the media file being played)When it fills [ASSETURI], the value is the MediaFile actually chosen (an unsupported FLV is listed first)."Optional" / "The URI of the ad asset currently being played."macro list, ASSETURI; macro list, ASSETURIlocateddescriptiveshoulddiffers
M11macrosIAB macro list: CACHEBUSTING, TIMESTAMP (contexts: all tracking pixels, including Error)Replaces [CACHEBUSTING] and [TIMESTAMP] in an Error URI as in any other tracking URI."All tracking pixels" / "All tracking pixels" / "both for VAST URLs and tracking pixel URLs, this would be the video player"macro list, CACHEBUSTING; macro list, TIMESTAMP; line 2465locatedmacro-list-requiredmustdiffers
M12macrosIAB macro list: CACHEBUSTING, TIMESTAMP (contexts: VAST request URIs)Replaces [CACHEBUSTING] and [TIMESTAMP] in a Wrapper's VASTAdTagURI before requesting it."VAST request URIs" / "VAST request URIs" / "The responsibility to properly replace macros with their proper values lies with the party that will perform the HTTP request." / "both for VAST URLs and tracking pixel URLs, this would be the video player" / "the VAST macro concept will be expanded to apply not just to tracking URIs, but to AdTagURIs in Wrapper creatives"macro list, CACHEBUSTING; macro list, TIMESTAMP; line 2463; line 2465; line 401locatedmacro-list-requiredmustdiffers
P06podsAd Pods (play the pod in sequence; play as many ads as possible)Plays all three ads of a pod."all ads in the Pod should be played to the best of the player's ability" / "should play as many of the ads as possible" / "all ads in the Pod must be played to the best of the player's ability"line 948; line 958; line 967locatedshouldshould
P03podsSec. 2.3.4 (fire each tracker at the appropriate time); Ad PodsPlaying a three-ad pod, each ad gets one impression and one complete, fired between its own impression and the next ad's."required to request the resource file for any included tracking elements from the URI provided at the appropriate times" / "the same impression and tracking URIs in the VAST <Wrapper> are called as each ad in the Pod is played"line 663; line 960locatedrequiredmust
P02podsAd Pods (an ad fails: move on)When the second pod ad cannot play, playback continues with another ad (the stand-alone ad or the third pod ad)."If stand-alone ads are unavailable, the player should move on to the next ad in the Ad Pod."line 962locatedshouldshould
P05podsAd Pods (substitute an un-played stand-alone ad)The failed pod ad is replaced by the stand-alone ad from the response, after the first pod ad and before the third."the media player should substitute an un-played stand-alone ad from the response"line 962locatedshouldshould
I01iconsIndustry Icon Support; Sec. 3.11.2 IconViewTrackingDisplays the Icon after the ad starts and requests its IconViewTracking URI."the media player must display the object as an overlay on top of the Linear Ad with which the icon is served and after the ad has started" / "The player uses the included URI to notify the icon server when the icon has been displayed."line 815; line 1617locatedmustmust
I03iconsSec. 3.11.1 Icon (offset, duration)Displays an Icon with offset 00:00:01 and duration 00:00:08 once playback passes 1 s, requesting its IconViewTracking URI."The time of delay from when the associated linear creative begins playing to when the icon should be displayed" / "The duration the icon should be displayed unless clicked or ad is finished playing"line 1609; line 1608locatedshouldshould
I02iconsSec. 3.11.5 IconClickTrackingOn a click on the Icon, requests its IconClickTracking URI."The media player is required to request the resource file for any included tracking elements" / "is used to track click activity within the icon"line 663; line 1653locatedrequiredmust
X07xmlSec. 2.3.3; Sec. 3.19.1 VASTAdTagURIFollows a VASTAdTagURI whose CDATA is surrounded by whitespace and line breaks (on the wire; URL parsers also strip the whitespace).(no VAST clause)--noneobservation
X08xmlSec. 3.14.3 (event values are an enumeration)Never requests a Tracking element whose event name is not a VAST event (notARealEvent)."A string that defines the event being tracked. Accepted values are listed in section"line 2001locateddescriptiveshoulddiffers
X09xmlSec. 3.18 Extensions (custom XML for the publisher, not VAST elements)Does not request Impression or Tracking URIs that appear inside an Extension."custom XML should fall under the nested <Extension> (singular) element so that custom XML can be separated from VAST elements"line 2200locatedshouldshould
X10xmlSec. 2.3.2 (XML 1.0: a UTF-8 byte order mark is allowed)Parses a document that starts with a UTF-8 byte order mark."must be able to play the ad in a VAST response" / "compliant with XML 1.0"line 470; line 516locatedmustmust
X11xmlSec. 2.3.3 (a URI containing "]]>" split across CDATA sections)Reassembles an Impression URI split across two CDATA sections (query s=x]]>x)."The media player is required to request the resource file for any included tracking elements from the URI provided" / "will be concatenated with the other two URI components"line 663; line 561locatedrequiredmust
X12xmlSec. 3.7.1 (VAST 4.0 idValue attribute: players should not fail)Accepts a UniversalAdId that still carries the VAST 4.0 idValue attribute."Media players should not fail if this attribute is present"line 1289locatedshouldshould
X13xmlSec. 3.4.4 (Impression)An empty Impression element does not stop the other Impression from being requested."The media player is required to request the resource file for any included tracking elements"line 663locatedrequiredmust
X14xmlSec. 4.3 Media Players (accept older VAST versions)Accepts a VAST 3.0 InLine document."VAST 4 players should continue to accept ads on older versions of VAST"line 2308locatedshouldshould
X15xmlSec. 4.3 Media Players (accept older VAST versions)Accepts a VAST 2.0 InLine document."VAST 4 players should continue to accept ads on older versions of VAST"line 2308locatedshouldshould
X16xmlSec. 4.3 Media Players (accept older VAST versions)Follows a VAST 3.0 Wrapper to a VAST 4.3 InLine."VAST 4 players should continue to accept ads on older versions of VAST"line 2308locatedshouldshould
R03robustness(HTTP; not a VAST clause)Follows an HTTP 302 redirect on a VASTAdTagURI.(no VAST clause)--noneobservation
R04robustness(HTTP; not a VAST clause)Parses a VAST response sent with Content-Encoding: gzip.(no VAST clause)--noneobservation
R05robustness(HTTP; not a VAST clause)Parses a VAST response served as text/plain rather than an XML media type.(no VAST clause)--noneobservation
R06robustness(HTTP; not a VAST clause)A tracking URI that answers HTTP 500 does not stop later trackers (quartiles, complete).(no VAST clause)--noneobservation
X17xmlSec. 2.2 (acknowledge XML comments); Sec. 2.3.2Does not request an Impression element that sits entirely inside an XML comment (next to a real Impression)."must be able to play the ad in a VAST response" / "acknowledge VAST comments in the standard XML syntax"line 470; line 475locatedmustmust
X18xmlSec. 2.3.2 (character entities should be honored); Sec. 3.19.1 VASTAdTagURIRequests a VASTAdTagURI written as escaped text, with &amp; between query parameters, with all parameters intact (a=1, b=2, c=3)."character entities and <!--XML comments--> should be honored"line 516locatedshouldshould
X19xmlSec. 2.3.2 (character entities should be honored); Sec. 3.19.1 VASTAdTagURIRequests a VASTAdTagURI written as escaped text, with the character reference &#38; between query parameters, with all parameters intact (a=1, b=2, c=3)."character entities and <!--XML comments--> should be honored"line 516locatedshouldshould
P07podsAd Pods and Stand-Alone Ads (play the pod in the prescribed sequence); Sec. 3.19Orders the pod ads of a Wrapper's target by their sequence attribute (document order 3, 1, 2; the Wrapper sets allowMultipleAds="true"): the ad with sequence 1 comes first (or the pod is declined with an error; pod support is optional)."the media player must play the ads in the Pod in the prescribed sequence"line 958locatedmustmust

1.2 Flagged rows (23)

Graded strength differs from the literal modal. Grouped by direction.

Graded must, text weaker or not modal (5)

Graded should, text has no modal (17)

Graded observation (1)

2. The full macro grid, split by set

Source: macro-grid.jsonl in the archive's macro-grid results, split by macro set. A literal or empty value deviates (Section 4.4 of the paper); "Deviating" is literal plus empty or absent; delegated cells are iab-vast-loader's pixels. Paper Table 7 condenses this grid: its "value", "-1 or -2" and "literal" columns are the 4.3 rows below for the tracking pixel, and its "4.x" column is the "other" pixel rows.

Set: "4.3" is the graded 4.3 set of paper Section 4.2, the macros whose introduction version on the IAB macro list is 3.0, 4.0, 4.1 or 4.2 (40 pixel macros, 41 request-URI macros); "other" is the macros outside the graded set, whose introduction version is "4.x" or "Next VAST release" (5 pixel macros, 9 request-URI macros). Of these nine, four were on the list, marked "Next VAST release", when VAST 4.3 was published (STOREID, STOREURL, PLAYBACKMETHODS, CONTENTCAT), and five were added in 2023 and 2024 (GPPSTRING, GPPSECTIONID and three DSA macros) (paper Section 4.2). The five pixel macros are those marked "4.x".

Table R5.2. The full macro grid, split by set

showing 24 of 24CSV
vast-client-js 6.5.0Tracking pixel4.3406340000
vast-client-js 6.5.0Tracking pixelother5005005
vast-client-js 6.5.0VAST request URI, CDATA4.34100410041
vast-client-js 6.5.0VAST request URI, CDATAother9009009
vast-client-js 6.5.0VAST request URI, escaped text4.34100410041
vast-client-js 6.5.0VAST request URI, escaped textother9009009
video-ad-sdk 4.0.1Tracking pixel4.34020380038
video-ad-sdk 4.0.1Tracking pixelother5005005
video-ad-sdk 4.0.1VAST request URI, CDATA4.34100410041
video-ad-sdk 4.0.1VAST request URI, CDATAother9009009
video-ad-sdk 4.0.1VAST request URI, escaped text4.34100410041
video-ad-sdk 4.0.1VAST request URI, escaped textother9009009
iab-vast-loader 2.5.1Tracking pixel4.3400000400
iab-vast-loader 2.5.1Tracking pixelother5000050
iab-vast-loader 2.5.1VAST request URI, CDATA4.34100410041
iab-vast-loader 2.5.1VAST request URI, CDATAother9009009
iab-vast-loader 2.5.1VAST request URI, escaped text4.34100410041
iab-vast-loader 2.5.1VAST request URI, escaped textother9009009
vastlint-client 0.15.0Tracking pixel4.34020380038
vastlint-client 0.15.0Tracking pixelother5005005
vastlint-client 0.15.0VAST request URI, CDATA4.34100410041
vastlint-client 0.15.0VAST request URI, CDATAother9009009
vastlint-client 0.15.0VAST request URI, escaped text4.34100140041
vastlint-client 0.15.0VAST request URI, escaped textother9000909

Pixel macros left literal, by set:

Of vast-client-js's five literal pixel macros, three were on the list when 4.3 was published (PLAYBACKMETHODS, STOREID, STOREURL) and two were added after it (GPPSECTIONID, GPPSTRING).

3. Every verdict, by client and by duty group

Every verdict is on two pages of these Online Resources, built from the reference results (Node.js layer and Chromium 141 on Linux; Firefox 142 and WebKit 26 added in the grid):

4. Sensitivity of the must-level counts to strength labels, per configuration

Computed from the Node.js and Chromium reference matrices with the strengths of code/harness/suite/requirements.mjs; Section 5.1.6 of the paper summarizes it. Each configuration is counted once: the seven open-source configurations in Chromium 141 and vastlint-client under Node.js. Cells are must-level deviating cells. A scenario relabels requirements; the deviating cells themselves do not change, only their strength.

Table R5.3. Sensitivity of the must-level counts to strength labels, per configuration

showing 9 of 9CSV
vast-client-js 6.5.0 (Chromium)32123
video-ad-sdk 4.0.1 (Chromium)1615131317
iab-vast-loader 2.5.1, defaults (Chromium)54345
iab-vast-loader 2.5.1, noSingleAdPods (Chromium)43234
vastlint-client 0.15.0 (Node.js)111010911
Shaka Player 5.2.12 (Chromium)2121201721
rmp-vast 17.2.0, defaults (Chromium)121110812
rmp-vast 17.2.0, omidSupport (Chromium)11109711
Google IMA HTML5 3.794.0 (Chromium), closed comparison44444
Total, eight configurations8376686384

Order of the configurations by must-level deviations:

Clients involved in any change of order: rmp-vast, vastlint-client.

IMA (Chromium) has 4 must-level deviations in every scenario.