Repository navigation
§ 5.2.4 to § 5.2.8 — Property option: seller relationship, app identity, and screens (#88) - #149
Open
KonstantinMirin wants to merge 268 commits into
Open
KonstantinMirin wants to merge 268 commits into
KonstantinMirin wants to merge 268 commits into
Conversation
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
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
- Rename apps[].domain to developer_domain, as IABTechLab#15 filed it. It is the developer domain from the store listing that app-ads.txt uses, not OpenRTB 2.6 app.domain, which is the domain of the app. - Define platform as the store that issued bundle, since a bundle is unique only within its store. - List apps[].platform and apps[].bundle in the Summary Representation (section 2.1), as IABTechLab#15 asked. Refs IABTechLab#15
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
Give each repeated concept one type in section 2.2, and state the table, presence, type, key, and value rules in section 2.6. Add Type and Required columns to every field and key table. Add the lifecycle, recorded, asserted, and mixed markers, and a line_items[] field. Define the Summary as a strict path subset, with manifest key tables. Delete catalog_ref. Rename the time, reference, delta, cap, and path fields to use the shared types. Number every heading, and keep issue citations and edit history out of normative text. Update the examples, the manifest, the appendices, and the docs. Teach check_appendix.py the new columns and a closed layout list, and add check_examples.py, which checks the examples against the spec's tables.
Add section 2.4: a rejection returns errors[], one or more ErrorObjects with an open code list, retry values that read for any request, and informative HTTP fits. Name the code each rejection in sections 5.5, 5.6.1, and 5.6.3 returns, and drop the requires cycle ban. Add the Ext type and section 2.5: ext on the proposal and each line item, keyed by owner domain, ignored and kept when not understood, and frozen at agreed. Make spec_version a required proposal field, and ask in section 8 how a receiver reads a later release. Add informative security considerations in section 2.7. Word the open questions without a count. Update the examples and appendices, and teach check_examples.py the Ext type and the open ErrorObject.
Make seller a Party in section 4.1, with a required legal_name, and add
buyer and commitment.advertisers[]. Move the registry_id rules to Party
in section 2.2, and scope proposal_id to seller.domain.
Add section 1.2 with the three identity layers. In section 5.8, require
visibility, define each value, and separate who may read from who may
commit. Eligibility is a resolve step that returns not_eligible, and an
unreadable line item returns not_found. A required credential is
{ credential_type, issuer }, and eligible_bidders[] splits into
eligible_buyers[] and eligible_seats[].
Give buyer_requirements, billing, and agreement key tables, and convert
the rows the terms and agreement change added. In section 2.3, drop the
manifest seller_id and filter on status, and ask in section 8 whether a
manifest needs both validators. Update the examples, appendices, and
checkers.
# Conflicts: # examples/proposal.yaml # spec/openproposal-3.0.md
Separate shared and issued proposals, and add issued_from. Define the binding record, record_digest, and assent[] entries, freeze a version's offered terms, and state one staleness rule for asks and holds. Give each act one history action, name the status types, make the line-item transitions exhaustive, define a firm entry per pricing entry, and list the allowed decline grounds once. State agreed once. Remove buyer state from the shared examples, add an issued, partly agreed example, and recompute its record_digest in the checker.
# Conflicts: # CONTRIBUTING.md
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 lets a seller list any domain without saying by what right it sells it. Its property keys sit in prose. This PR gives the property option one key table, and each part of it a numbered section.
PropertyOptionhas one key table. Each property statesseller_relationshipandchild_audience, and carriesdomains[],apps[], or both. Whenpropertiesis absent, the seller promises no property.tv_channelandtv_network, AdCOM 1.0ChannelandNetworkmatched bydomain, so a buyer can tell when two sellers offer one channel, from @unreconciled, who corrected the matching key.AppIdis{ store, bundle }, andAppaddsstore_urlanddeveloper_domain.store, aVocabularyTerm, names the app store.SellerAccountnames the accounts it checks. An app's governing developer domain comes from its store listing.audiencesand buyer-supplied data.Screen,Loop, andSyncGrouptables.app_bundle[]becomesapps[]ofAppId.Option.scripts/check_appendix.pylints both.child_audience, andseller_relationship. § 2.7 coversstore_urlas an author-chosen URL.Related issue
Closes #88.
Refs #15, #17, #96, #97, and #71.
Builds on
This PR builds on our DOOH PR and, through it, on these PRs of ours:
It merges #17 by @Sirajmx. Through our PRs it carries #18, #70, #71, and #72 by @Sirajmx, #73, #74, #75, and #76 by @Kishore-2572, and #117 and #118 by @aleksUIX. Review the commits "Give the property option one key table and one app identity", "Let a property name the TV channel and network it carries", "Match TV channels and networks by domain", "Record the property option changes the changelog left out", "Write the movable condition on lat and lon as a value", and "Reject coordinates on a movable screen".
Type
Checklist
propertieskeepsSelectable[PropertyOption];scripts/check_appendix.pypassesexamples/is updated and still parses. Each property gainsseller_relationship,child_audience, andseller_accounts[].platform: rokubecomesstore: roku_channel_store, and the audio example names a property.manifest.jsonis regenerated, and both proposal examples carry a recomputedrecord_digest.scripts/check_examples.pyreads the new tables and passes.scripts/check_pricing_fixtures.pypasses 60 of 60storethe seller doesn't know.selectabledeclaresavailable[]andincluded[]; anythingsettabledeclares bounds (§ 3.1, § 3.2) —propertieskeeps both; no newselectableorsettablefieldsKnock-on effects
seller_relationshipandchild_audience. A property sold by a reseller or through a deal mechanism needsseller_accounts[].developer_domainstays RECOMMENDED but informative. The check reads the store listing, which closes the gap @fgranata raised.inventory_partner_domainsits on the property, and § 5.2.6 checksseller_accounts[]against the partner's ads.txt.AppId.platformbecomesstore,storeurlbecomesstore_url, andapp_bundle[]becomesapps[].inventorypartnerdomainbecomesinventory_partner_domain.seller_accounts[]is REQUIRED when the line item offers a deal mechanism (§ 5.9), not when it offers anything butDIRECT_IO. The manager row readsgeoormarkets.Screen.time_zoneis OPTIONAL.child_audienceandchild_treatmentbecomePropertyOptionrows. Our audience PR brings the audience half.exclusionsas a map whoseappsentries areAppId. Until then,apps[]sits beside the other block-list keys.line-item-ctv.yaml, and our formats PR reconciles them.Open questions
seller_relationshipis REQUIRED, andinventory_partner_domainsits on the property. Question 4 is settled here: this PR merges § 5.2 — App identity on properties (#15) #17 and makesdeveloper_domaininformative.propertiesis OPTIONAL, so a line item with no property states no seller relationship or child-directed status. Shouldpropertiesbe REQUIRED, so that every line item states a seller relationship and a child-directed status?Contribution Terms
Analyzed and generated with the help of Claude, fully reviewed by me.