Decision records · Types the tables leave open
D-016 What does an object field hold when the specification gives it no structure?
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
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:
assentas{ 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_tagsas{ wrapper_types[], vast_versions[] }.approvalas{ review_sla, revision_policy }, the SLA a length of time.content_detailas{ shows[], series[], sections[], network_verticals[] }.creative_policyas{ 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_listas{ 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
assentrow L189 at 44dfaafassent| Object | derived | Buyer and seller assent records and timestamps for the binding version. Signature scheme is WS1§ 4.2, the
specificationsrow L201 at 44dfaafspecifications| String/Object | seller-set | Structured detail at media-kit depth§ 5.2, the
content_detailrow L226 at 44dfaafcontent_detail| Object | seller-set | Shows, series, sections, network verticals§ 5.4, the
specsrow L243 at 44dfaafspecs| Object | seller-set | As defined by the referenced format registry entry. OpenProposal does not hardcode a shape per channel§ 5.4, the
third_party_tagsrow L244 at 44dfaafthird_party_tags| Object | seller-set | Accepted wrapper types and VAST versions§ 5.4, the
approvalrow L248 at 44dfaafapproval| Object | seller-set | Review SLA and revision policy§ 5.6, the
cancellation_policyrow L280 at 44dfaafcancellation_policy| Object | selectable |available[]of cancellation rights withpricingper option§ 5.6, the
exclusivityrow L281 at 44dfaafexclusivity| Object | selectable |available[]of exclusivity terms withpricing§ 5.6, the
creative_policyrow L282 at 44dfaafcreative_policy| Object | seller-set | Content and category restrictions on creative§ 5.3, the
buyer_suppliedrow'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
assentrow L182 on main at 981a74eassent| Object | derived | Buyer and seller assent records and timestamps for the binding version. Signature scheme is WS1§ 4.2, the
specificationsrow L194 on main at 981a74especifications| String/Object | seller-set | Structured detail at media-kit depth§ 5.2, the
content_detailrow L219 on main at 981a74econtent_detail| Object | seller-set | Shows, series, sections, network verticals§ 5.4, the
specsrow L236 on main at 981a74especs| Object | seller-set | As defined by the referenced format registry entry. OpenProposal does not hardcode a shape per channel§ 5.4, the
third_party_tagsrow L237 on main at 981a74ethird_party_tags| Object | seller-set | Accepted wrapper types and VAST versions§ 5.4, the
approvalrow L241 on main at 981a74eapproval| Object | seller-set | Review SLA and revision policy§ 5.6, the
cancellation_policyrow L273 on main at 981a74ecancellation_policy| Object | selectable |available[]of cancellation rights withpricingper option§ 5.6, the
exclusivityrow L274 on main at 981a74eexclusivity| Object | selectable |available[]of exclusivity terms withpricing§ 5.6, the
creative_policyrow L275 on main at 981a74ecreative_policy| Object | seller-set | Content and category restrictions on creative§ 5.3, the
buyer_suppliedrow'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
| Example | Where | Why | Input |
|---|---|---|---|
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