Repository navigation
§ 5.2, § 5.9 — Video and audio: programs, break position, and the audio feed (#99, #100, #101) - #150
Open
KonstantinMirin wants to merge 129 commits into
Open
KonstantinMirin wants to merge 129 commits into
KonstantinMirin wants to merge 129 commits into
Conversation
§ 5.6 defines floor as the seller's offer floor at proposal time, not the downstream auction floor and not a guarantee that bids will clear. Editorial: the meaning of the field is unchanged. Refs IABTechLab#16
A proposal can say its line items must be bought together (linked_execution, § 4.1), and a line item can name the line items or spend that must be in the same commitment (requires, § 5.6.3). A bonus line is a line item with requires and its own price. The § 2 "binding terms" hook now points at a field, and the Summary Representation carries has_requires and linked_execution. Adds a CTV bonus line example (§ 6.5) and linked_execution: none to the proposal example. Refs IABTechLab#23
The seller declares which exclusion types it accepts and how it
enforces each (exclusions_accepted); the buyer supplies its lists
(exclusions). Blocked apps carry their store, { platform, bundle },
so one store id is never applied across stores. Exclusions are
recompute inputs (§ 3.3) and are never disclosed to other parties
(§ 5.8). The display example declares and supplies lists.
Refs IABTechLab#25
A line item whose rate differs by market can declare geo with the selectable structure of § 3.1: available[], included[], pricing deltas and max_select. A geo that declares only allowed[] stays settable, so existing payloads are unchanged. When several priced markets are selected, the highest delta applies. The audio example is priced by market. Refs IABTechLab#14
A commitment names the proposal and version it was priced against (§ 5.6.1). The seller rejects a new attempt on a stale version, or past valid_until or price_valid_until, and returns the current version. An authenticated replay with the same idempotency_key and terms returns the stored result without re-running those checks; the same key with different terms is a conflict. Keys are opaque and scoped to one buyer and seller pair. § 4.1 states that each revision while published increments version. The display, CTV and audio examples carry proposal_id and version. Refs IABTechLab#24
§ 4.1 adds an optional, immutable proposal_template_id linking an issued proposal to the seller's template. Each issued proposal has its own status, version and negotiation_history[], and buyers never need the template id to transact. § 7 adds a non-normative note separating seller-side templates from the issued proposals buyers commit against. Appendix A gains one row; Appendix B counts immutable 6 → 7 and 72 fields. The proposal example carries a proposal_template_id. Refs IABTechLab#26
§ 5.8 adds terms_ref ({ url, sha256, version }), REQUIRED when
terms_acceptance_required is true, hash-pinned and frozen at agreed, so
assent binds to an exact document. § 5.10 adds agreement_ref, an
informative pointer to the master or annual agreement a line item is
priced under, and documents the io and agreement roles on
external_references[]. IO generation is stated to be a connector
concern, and § 7 adds a non-normative note on relationships.
agreement_ref is seller-set; a buyer-held agreement id travels as an
external_references[] entry with role: agreement, so the field keeps
one marker (§ 3).
Appendix A gains two rows; Appendix B counts seller-set 29 → 31 and
73 fields. The display example carries terms_ref.
Refs IABTechLab#27
A new § 2.3 lets a seller publish its public standard line items at /.well-known/openproposal.json: seller_id, generated_at, spec_version and, per proposal, proposal_id, version, the Summary Representation of each line item and a full_url. ETag / Last-Modified are required, only line items with visibility public appear, and entries must match the current version. Buyers discover from the manifest, then fetch the Full Representation of shortlisted line items. Adds examples/manifest.json (§ 6.5) and visibility: public to the CTV and audio examples; the registry_gated display line item is not listed. Refs IABTechLab#29
The specification does not define authentication yet (WS1; see IABTechLab#62), so the replay rule now applies to a replay from the same buyer rather than an authenticated replay. Refs IABTechLab#24
agreement_ref.parties used buyer_id, which the specification does not define. parties[] now names the seller by its seller_id and the buyer by the id it holds in eligible_bidders[] (section 5.8). Refs IABTechLab#27
The rule that a hold on a linked_execution: all proposal uses hold_scope: proposal came from a comment on IABTechLab#23, not the change request as filed. It moves to the PR description as a point for the working group, so this PR carries only the filed change. Refs IABTechLab#23
IABTechLab#25 names the content-category list iab_content_category[], a list of IAB Content Taxonomy ids. The earlier commit renamed it content_category with a version-pinned taxonomy_ref, which nobody proposed. This restores the filed name and shape; which taxonomy version to reference is left to the working group. Refs IABTechLab#25
IABTechLab#14 doesn't say how deltas combine when a buyer selects more than one priced market, and neither did any comment on it. The earlier commit said the highest delta applies; that is a design choice nobody proposed, so it moves to the PR description as a question. Refs IABTechLab#14
Read the media condition from the ad served when an impression accepts several media, name the seller as the party that serves, place linear TV outside the table, and state environments as (distribution channel, device type) pairs. Insert environments.available[] into the summary list without rewrapping it, shorten the changelog entry and drop audio_streaming from OQ-7 in docs/open-questions.md. Refs IABTechLab#90
Move the summary rule out of the § 2.1 key list, drop skip from the CTV example, and mark the CHANGELOG entry as breaking.
time_zone is the line item's clock for daypart windows and
frequency_cap.period: an IANA time zone name or viewer_local. A window
is { days[], start, end } in civil time with an exclusive end later
than start, up to 24:00; a window that crosses midnight is two windows.
List the `days[]` values once in the `daypart` row, as `monday` | ... | `sunday`. Write HH:MM, America/New_York, and UTC as plain text, since they're a format and examples, not field names. The meaning is unchanged.
"At least one of" an empty list is never satisfied, so the bonus line would fail a literal check. An absent key sets no condition. Only the examples change; the any_of[] row and the rules stay as filed in IABTechLab#23. Refs IABTechLab#23
The floor row now says it "neither constrains nor describes the downstream auction floor", as IABTechLab#16 asked, and names that floor: the per-impression floor the exchange applies at auction time (OpenRTB 2.6 Imp.bidfloor). Refs IABTechLab#16
From the Postindustria review on IABTechLab#73: - a replay matches on the same body, every value the buyer sent except idempotency_key, and returns the stored result whether an acceptance or a rejection; a retry against a new version uses a new key; - version increments on each revision of the proposal, not only while published, so a counter under review also moves it; - "deterministic" now says what the checks depend on: the stored proposal and the time the seller receives the attempt; - the price check names the pricing[] entry the commitment is priced against. Refs IABTechLab#24
…ntract No IAB Tech Lab document defines the AAMP wire and lifecycle contract yet. The pre-release iab-agentic-primitives library's OpenAPI file and JSON Schemas define the messages the reference agents exchange, so an implementer can use them as the binding until the contract is published. Refs IABTechLab#59
The manifest's hold_limits states the most holds a seller grants at once, per buyer domain and per advertiser. A seller declines a request over a declared limit, and under a per-advertiser limit may decline one that names no advertiser.
Where a value whose Type cell is String conflicts with a typed field of the same version in the binding record, the typed field governs. Identifiers and codes are excluded, and an Enum or shared-type value is a typed field.
A line item's preemption MAY state a remedy, from an open vocabulary with the core terms makegood, credit, and none. It settles the delivery a preemption takes on any delivery_type, in place of shortfall_remedy, so a preempted share-of-voice buyer knows what it gets before committing.
When a line item's preemption states a remedy, the delivery a preemption takes, less any replacement within the flight, is a shortfall on any delivery_type. It settles as though that remedy were the only option in effect at commit, under the remedy_terms of shortfall_remedy. When none is in effect in shortfall_remedy, it must be the only option. Section 8 question 10 adds how much delivery a preemption takes.
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.
What this changes
Draft 1 can't say where in a break an ad plays, or which show or game it runs in. Nor can it name the audio feed, or say if the ad is recorded into the content.
placementgets aPlacementkey table (§ 5.2.2), withfeedandssai. It is REQUIRED on avideooraudioline item, andplcmtonvideo.break_positionoptions, whichavailabilityrecomputes against (§ 3.3).Contentand a LEAPEventSchedule. It says what happens when an event doesn't air.content_detailis removed.episodesis its own field, REQUIRED on a podcast or catch-up radio feed.dai,scheduled, andembeddedfor every channel, and the rules for anembeddedline item.creative_delivery.protocols[]takes AdCOM Creative Subtypes codes, andother_protocols[]takes terms. They replaceprotocolandthird_party_tags.ProductionOptionlosescost, sincedeltasprices a build, andbuild_ownerbecomesbuilt_by.ctvline item that carriesplcmttoadtypes2. New § 6.10 and § 6.11 show an embedded podcast and a live event series.Related issue
Closes #99. Closes #100. Closes #101.
Refs #89, #120, and #121.
Builds on
This PR builds on our placement PR (#120), which merges first, and our DOOH PR. It builds on our settlement PR, our pricing PR, our handoff PR, our post-agreement PR, and our holds PR. Those build on our signing PR, buyer writes PR, lifecycle PR, parties PR, errors and extensions PR, and shared types PR. Through them it carries #18, #70, #71, and #72 by @Sirajmx, #73 to #76 by @Kishore-2572, and #117 and #118 by @aleksUIX. Review "Define video and audio placement, programs, and break position" and the podcast example fix.
Type
Checklist
programs,episodes,break_position, andretention;content_detailandthird_party_tagsremoved;placementandcontrolling_measurementrows updated.scripts/check_appendix.pypassesselectablegoes from 14 to 16, and the field count from 97 to 99.seller-setstays 47:episodesandretentionin,content_detailandthird_party_tagsout.examples/is updated and still parses — newline-item-podcast-embedded.yaml(§ 6.10) andline-item-ctv-live-series.yaml(§ 6.11).line-item-rewarded-video.yaml(§ 6.7) uses the current field names. The CTV examples gainplacement.ssaiandserving_mode: dai, § 6.3 gains pricedbreak_positionoptions, and the audio example gainsplacement.feed. Bothrecord_digestvalues are recomputed, andmanifest.jsonis regenerated.scripts/check_examples.pychecks tentative events and theembeddedrules, and passes.scripts/check_pricing_fixtures.pypasses 60 of 60selectabledeclaresavailable[]andincluded[]; anythingsettabledeclares bounds (§ 3.1, § 3.2) —programsandbreak_positiondeclare both; no newsettablefieldsKnock-on effects
content_detail,third_party_tags,creative_delivery.protocol,production.available[].cost,build_owner,serving_modeclient_sideorssai, orsource_type0no longer conforms. Avideooraudioline item needsplacement, withplcmton video andfeedon audio. Anembeddedline item needsretentionandcontrolling_measurement.feedandepisodes. Hereepisodesleaves free-textcontent_detail. Their per-episode categories stay with [Change] § 5.2, § 5.5: Structured content categories (taxonomy_ref) on inventory, and a contextual targeting bound #48.content, andscheduletakesInstanttimes. Over OpenRTB 2.6,contentvalues take OpenRTB key names, such aslivestream.episodesstands alone, answering [Change] § 5.2 — Make programs and live events selectable, and say what happens when one doesn't air #100 question 5 and [Change] § 5.2, § 5.9 — Audio: name the feed, and say when an ad is recorded into the content #101 question 3.serving_modehas three core terms, andplacement.ssaistates server-side insertion. Anembeddedline item omitsmarkets.plcmtis REQUIRED only onvideo. Onctvits presence states video, answering its question 7.placementmoves to § 5.2.2, and the OM SDK rule readsmeasured_by.reward,instl, andskiptakeIntegerFlag, and § 6.5 becomes § 6.7.placementandrefreshgain key tables, as its rule 2 asks.programsis § 5.2.9. Our formats PR reconciles the two with our audience PR.Open questions
final_afteris OPTIONAL. Without it, § 5.9 sets no end to post-flight counting on anembeddedline item, and § 5.7.1 leaves that toterms_refs[]. Shouldembeddedrequirefinal_after? This extends [Change] § 5.2, § 5.9 — Audio: name the feed, and say when an ad is recorded into the content #101 question 4.placement.feed, as on avideoline item, every copy the seller distributes counts toward delivery underretention. Should anembeddedvideoline item name which copies count?ssai: 0, which AdCOM defines as status unknown?By opening this pull request I agree my contribution may be published under this
repository's licence, as set out in CONTRIBUTING.md.
Analyzed and generated with the help of Claude, fully reviewed by me.