OpenProposal 3.0 JSON Schema Unofficial

Decision records · Types the tables leave open

D-016 What does an object field hold when the specification gives it no structure?

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

What the schemas do

A named object that accepts any members, so the field validates as an object and the members stay the field's owner's to define.

Options

  • open-object Chosen

    A named object that accepts any members, so the field validates as an object and the members stay the field's owner's to define.

  • invent-shape

    Members chosen from the prose and the examples.

  • text

    A string.

Why

Seven fields are typed Object and described only in prose: assent, specifications, content_detail, specs, third_party_tags, approval, and creative_policy. The cancellation rights and exclusivity terms that cancellation_policy and exclusivity offer, and the suppression_list member of buyer_supplied, are the same case. Type rules § 4 names every object, so each one is a named object, and it accepts any members, because the specification states none and members chosen here would be invented fields. specs is defined by the format registry and assent by WS1, which confirms that their structure lives elsewhere. specifications is typed String/Object, so its object branch is the open object SpecificationsDetail (D-017). A daypart's time window isn't among them: the window follows the ad server convention (D-004). Each open object's schema and SDK type carry what its row says of it, so a reader sees what it holds though its members are unstated. The structures the feedback proposes, read from each row's prose, stay proposals: the schema keeps the objects open until the text states their members.

What we ask the specification to state

Define each of these objects, or say where it is defined, as specs does for the format registry. Until then an implementation can't validate or compare them, and two implementations will fill them differently. Name the members of a cancellation right and an exclusivity term, beside the id that names each option. Say whether specifications is free form. For the rest, each row's prose suggests a structure, which we propose as the starting point:

  • assent as { buyer, seller }. Each party's record is { version, at, signature }: the version it assents to, when, and a signature in the scheme the row calls WS1.
  • third_party_tags as { wrapper_types[], vast_versions[] }.
  • approval as { review_sla, revision_policy }, the SLA a length of time.
  • content_detail as { shows[], series[], sections[], network_verticals[] }.
  • creative_policy as { content_restrictions[], category_restrictions[] }, the content and the category restrictions its row names. Say whether a category restriction names a category of the IAB Tech Lab Content Taxonomy, of its Ad Product Taxonomy, or of another list.
  • suppression_list as { source, size, match_method }, the members the display example writes.

The specification lines it rests on

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

main

  • § 4.1, the assent row L189 at 44dfaaf
    assent | Object | derived | Buyer and seller assent records and timestamps for the binding version. Signature scheme is WS1
  • § 4.2, the specifications row L201 at 44dfaaf
    specifications | String/Object | seller-set | Structured detail at media-kit depth
  • § 5.2, the content_detail row L226 at 44dfaaf
    content_detail | Object | seller-set | Shows, series, sections, network verticals
  • § 5.4, the specs row L243 at 44dfaaf
    specs | Object | seller-set | As defined by the referenced format registry entry. OpenProposal does not hardcode a shape per channel
  • § 5.4, the third_party_tags row L244 at 44dfaaf
    third_party_tags | Object | seller-set | Accepted wrapper types and VAST versions
  • § 5.4, the approval row L248 at 44dfaaf
    approval | Object | seller-set | Review SLA and revision policy
  • § 5.6, the cancellation_policy row L280 at 44dfaaf
    cancellation_policy | Object | selectable | available[] of cancellation rights with pricing per option
  • § 5.6, the exclusivity row L281 at 44dfaaf
    exclusivity | Object | selectable | available[] of exclusivity terms with pricing
  • § 5.6, the creative_policy row L282 at 44dfaaf
    creative_policy | Object | seller-set | Content and category restrictions on creative
  • § 5.3, the buyer_supplied row's description: the inline object L236 at 44dfaaf
    { segments_allowed, suppression_allowed, match_rate_expected, segments[], suppression_list }

With the open PRs

  • § 4.1, the assent row L182 on main at 981a74e
    assent | Object | derived | Buyer and seller assent records and timestamps for the binding version. Signature scheme is WS1
  • § 4.2, the specifications row L194 on main at 981a74e
    specifications | String/Object | seller-set | Structured detail at media-kit depth
  • § 5.2, the content_detail row L219 on main at 981a74e
    content_detail | Object | seller-set | Shows, series, sections, network verticals
  • § 5.4, the specs row L236 on main at 981a74e
    specs | Object | seller-set | As defined by the referenced format registry entry. OpenProposal does not hardcode a shape per channel
  • § 5.4, the third_party_tags row L237 on main at 981a74e
    third_party_tags | Object | seller-set | Accepted wrapper types and VAST versions
  • § 5.4, the approval row L241 on main at 981a74e
    approval | Object | seller-set | Review SLA and revision policy
  • § 5.6, the cancellation_policy row L273 on main at 981a74e
    cancellation_policy | Object | selectable | available[] of cancellation rights with pricing per option
  • § 5.6, the exclusivity row L274 on main at 981a74e
    exclusivity | Object | selectable | available[] of exclusivity terms with pricing
  • § 5.6, the creative_policy row L275 on main at 981a74e
    creative_policy | Object | seller-set | Content and category restrictions on creative
  • § 5.3, the buyer_supplied row's description: the inline object L229 on main at 981a74e
    { segments_allowed, suppression_allowed, match_rate_expected, segments[], suppression_list }

Examples that disagree with the text

ExampleWhereWhyInput
examples/line-item-display.yaml/buyer_supplied/suppression_list/match_method
/buyer_supplied/suppression_list/size
/buyer_supplied/suppression_list/source
The specification gives suppression_list no structure, so the generated schemas leave it an open object and define none of its keys. The example uses source, size, and match_method, which the specification should define.main, open PRs

What it shapes

main: Approval, Assent, CancellationPolicyOption, ContentDetail, CreativePolicy, ExclusivityOption, Specifications, SpecificationsDetail, Specs, SuppressionList, ThirdPartyTags, BuyerSupplied.match_rate_expected, BuyerSupplied.segments, BuyerSupplied.segments_allowed, BuyerSupplied.suppression_allowed, BuyerSupplied.suppression_list, LineItem.approval, LineItem.cancellation_policy, LineItem.content_detail, LineItem.creative_policy, LineItem.exclusivity, LineItem.specs, LineItem.third_party_tags, Proposal.assent, Proposal.specifications

With the open PRs: Approval, Assent, CancellationPolicyOption, ContentDetail, CreativePolicy, ExclusivityOption, Specifications, SpecificationsDetail, Specs, SuppressionList, ThirdPartyTags, BuyerSupplied.match_rate_expected, BuyerSupplied.segments, BuyerSupplied.segments_allowed, BuyerSupplied.suppression_allowed, BuyerSupplied.suppression_list, LineItem.approval, LineItem.cancellation_policy, LineItem.content_detail, LineItem.creative_policy, LineItem.exclusivity, LineItem.specs, LineItem.third_party_tags, Proposal.assent, Proposal.specifications

The record's YAML file