OpenProposal 3.0 JSON Schema Unofficial

Decision records · Where each statement is checked

D-030 How is each § 4 and § 5 field statement checked, as a schema, a rule on payloads, or an obligation on a party's behavior?

Gap Decision 34 on the supporting page of #121. Cited on main and with the open PRs.

What the schemas do

A statement about one line item's or proposal's fields, or about two versions, is a rule owned by the smallest object it mentions. A statement about delivery, disclosure, or how a seller treats a request is an obligation. A statement the schema already says maps to the schema.

Options

  • by-subject Chosen

    A statement about one line item's or proposal's fields, or about two versions, is a rule owned by the smallest object it mentions. A statement about delivery, disclosure, or how a seller treats a request is an obligation. A statement the schema already says maps to the schema.

  • all-obligations

    Every statement outside the tables is an obligation.

Why

Rules on a line item: plcmt for video ads, environments that match the channel, the OMID condition on third-party measurement, exclusion types within exclusions_accepted.types, list_ref and terms_ref pinned and resolved or frozen at agreed, a consumer skipping an unknown channel (type rules § 9), and the requestable materials_due and committed_metrics[], which compare two versions. Rules on a proposal: negotiation_history[] is append-only. Rules on HoldStatus: the hold transitions none → requested → held → expired, released, or converted. "Each property MUST carry domains, apps or both" is the property option's schema, and offering one inventory "through more than one" mechanism is the selectable structure's list. The rest are obligations of the seller: serving only its channel, delivering only to impressions that match placement, rejecting an app entry whose platform it can't determine or an unaccepted exclusion type, never presenting best_effort as a guarantee, never disclosing a buyer's exclusions, and never requiring proposal_template_id.

What we ask the specification to state

Put each cross-field requirement in the section of the object that holds all its fields, and mark seller behavior apart from requirements on the document.

The specification lines it rests on

Each line is quoted as the record pins it. Expand an item to read the quote.

main

  • § 5.6.2, paragraph 1: the value list L312 at 44dfaaf
    expired | released | converted
  • § 4.1, a requirement L192 at 44dfaaf
    Entries MUST NOT be edited or removed
  • § 5.4, a requirement L247 at 44dfaaf
    A buyer MAY request a later date
  • § 5.7, a requirement L320 at 44dfaaf
    Seller declares a ceiling; a buyer MAY request above it
  • § 5.9, a requirement L339 at 44dfaaf
    A seller MAY offer the same inventory through more than one

With the open PRs

  • § 5.6.2, paragraph 1: the value list L305 on main at 981a74e
    expired | released | converted
  • § 4.1, a requirement L185 on main at 981a74e
    Entries MUST NOT be edited or removed
  • § 4.1, a requirement L197 in #74
    proposal_template_id MUST NOT be required for a buyer to transact.
  • § 5.1.1, a requirement L248 in #119
    The seller MUST serve a line item only on impressions of its channel.
  • § 5.1.1, a requirement L247 in #119
    A consumer MUST skip a line item whose channel it does not recognise, and MUST NOT reject the proposal because of it.
  • § 5.2, a requirement L225 in #17
    Each property MUST carry domains, apps or both
  • § 5.2, a requirement
    plcmt is REQUIRED for video ads.

    The integration of the open PRs wrote this text, to resolve a conflict or as its lock records, so no commit on GitHub holds it.

  • § 5.2.1, a requirement L280 in #119
    Each environments.available[] value MUST match at least one impression to which 5.1.1 gives the line item's channel.
  • § 5.2.2, a requirement L263 in #120
    The seller MUST NOT deliver the line item to an impression that does not match a key that is present.
  • § 5.2.2, a sentence L272 in #120
    An impression matches api[] when it supports every listed framework, playmethod[] when its playback method is one of the listed values, and refresh when the slot renders each creative for at least min_interval_s seconds before it refreshes, or does not refresh.
  • § 5.2.2, a requirement L265 in #120
    Unless api[] includes OMID 1.0 (7), a line item whose committed_metrics[] includes viewable_rate and whose environments.available[] includes app_mobile or ctv SHOULD NOT offer a measurement_source vendor other than the seller.
  • § 5.4, a requirement L240 on main at 981a74e
    A buyer MAY request a later date
  • § 5.5, a requirement L288 in #71
    A seller MUST reject an entry whose platform it cannot determine, rather than apply it across stores.
  • § 5.5, a requirement L294 in #71
    A buyer MUST NOT supply an exclusion type absent from exclusions_accepted.types.
  • § 5.5, a requirement L295 in #71
    A seller MUST reject it deterministically rather than ignore it.
  • § 5.5, a requirement L297 in #71
    A seller MUST NOT present best_effort enforcement as a guarantee.
  • § 5.5, a requirement L298 in #71
    list_ref MUST be hash-pinned, and resolved into the stored record at agreed, as for catalog_ref (§ 2.2).
  • § 5.7, a requirement L313 on main at 981a74e
    Seller declares a ceiling; a buyer MAY request above it
  • § 5.8, a requirement L335 in #75
    terms_ref MUST be hash-pinned and frozen at agreed.
  • § 5.8, a requirement L372 in #71
    A seller MUST NOT disclose a buyer's exclusions to any party other than that buyer.
  • § 5.9, a requirement L332 on main at 981a74e
    A seller MAY offer the same inventory through more than one

The record's YAML file