Decision records · Value formats
D-019 What is the option type of each selectable or settable field whose options the specification describes only in prose?
What the schemas do
- A format ID is written <channel>/<format>, as the row namespaces it by channel, with neither part empty.
- Geo codes and device categories are codes that other lists define, carried as written. Each field's description names its list.
- A daypart option is a time window { days[], start, end }, as Google Ad Manager writes a day part.
- Cancellation rights and exclusivity terms are open objects.
- production's inline object is its option.
- shortfall_remedy takes its listed remedies.
Options
Why
Selectable and Settable can't be copied without their option type. The row states a format ID's form: "registry format ids namespaced by channel", written display/300x250 and audio/host-read-30s. A namespace is a prefix, so a format ID holds a channel and a format, joined by the / the row writes, and 300x250 alone isn't one. That constraint comes from the row's text, not from the example files, and it validates differently from any other ID, so a format ID is a FormatId, with the pattern <channel>/<format>. The text says nothing about what each part holds, so the schema takes the least it can: neither part is empty or holds a /, a space, or a control character. Every format ID the text or an example writes has that form: available[], a property's supported_formats, and an asset's format_ref. Geo codes and device categories are codes from lists that other systems keep, and a receiver compares each as written, the way it compares any ID another system defines, so each is an ExternalId, and the field's description says which list it comes from. They come from lists the specification doesn't name: the examples write ISO 3166-1 alpha-3 codes and ISO 3166-2 codes for geo, so no one code list fits, and the text states no form for either. A geo bound and a device bound are then copies of one application, Settable<ExternalId>, each named after its field. A daypart option is a time window, which follows the ad server convention (D-004). Cancellation rights and exclusivity terms have no members anywhere in the specification, so each is an open object (D-016), named as type rules § 7 names an option: CancellationPolicyOption and ExclusivityOption. production's object { custom_unit, build_owner, lead_time, cost } follows "available[] of build options", so it is the option, named ProductionOption. shortfall_remedy takes makegood, credit, and none; the prose adds remedy_terms beside them, which has no type and no place in the selectable structure, so the model leaves it out.
What we ask the specification to state
Give each selectable and settable field its option type:
- The
formatsrow namespaces a format ID by channel, asdisplay/300x250. State that grammar as<channel>/<format>, and say what a channel and a format may hold. Then300x250alone is rejected everywhere a format ID appears:formats, a property'ssupported_formats, and an asset'sformat_ref. - Name the code lists for
geoanddevice, and define a cancellation right and an exclusivity term. - Say where
remedy_termsgoes and what it holds.
The specification lines it rests on
Each line is quoted as the record pins it. Expand an item to read the quote.
main
§ 5.4, the
formatsrow L242 at 44dfaafformats| Object | selectable |available[]of registry format ids namespaced by channel (display/300x250,audio/host-read-30s),included[],pricing,max_select§ 5.4, the
productionrow L249 at 44dfaafproduction| Object | selectable | Custom units.available[]of build options withpricingandlead_time;{ custom_unit, build_owner, lead_time, cost }§ 5.5, the
georow L258 at 44dfaafgeo| Object | settable |allowed[]of geo codes the buyer may select within§ 5.5, the
devicerow L259 at 44dfaafdevice| Object | settable |allowed[]of device categories§ 5.5, the
daypartrow L260 at 44dfaafdaypart| Object | settable |allowed[]of time windows§ 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.7, the
shortfall_remedyrow L322 at 44dfaafshortfall_remedy| Object | selectable |available[]frommakegood|credit|none, plusremedy_terms§ 5.4, the
productionrow's description: the inline object L249 at 44dfaaf{ custom_unit, build_owner, lead_time, cost }
With the open PRs
§ 5.4, the
formatsrow L235 on main at 981a74eformats| Object | selectable |available[]of registry format ids namespaced by channel (display/300x250,audio/host-read-30s),included[],pricing,max_select§ 5.4, the
productionrow L242 on main at 981a74eproduction| Object | selectable | Custom units.available[]of build options withpricingandlead_time;{ custom_unit, build_owner, lead_time, cost }§ 5.5, the
georow L260 in #72geo| Object | selectable |available[]of geo codes withincluded[],pricingdeltas andmax_select(§ 3.1), for a line item priced by market. Ageothat declares onlyallowed[]issettable. See below§ 5.5, the
devicerow L252 on main at 981a74edevice| Object | settable |allowed[]of device categories§ 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.7, the
shortfall_remedyrow L315 on main at 981a74eshortfall_remedy| Object | selectable |available[]frommakegood|credit|none, plusremedy_terms§ 5.4, the
productionrow's description: the inline object L242 on main at 981a74e{ custom_unit, build_owner, lead_time, cost }
What it shapes
main: CancellationPolicyOption, ExclusivityOption, FormatId, ProductionOption, LineItem.cancellation_policy, LineItem.daypart, LineItem.device, LineItem.exclusivity, LineItem.formats, LineItem.geo, LineItem.production, LineItem.shortfall_remedy, ProductionOption.build_owner, ProductionOption.cost, ProductionOption.custom_unit, ProductionOption.lead_time
With the open PRs: CancellationPolicyOption, ExclusivityOption, FormatId, Geo, ProductionOption, LineItem.cancellation_policy, LineItem.device, LineItem.exclusivity, LineItem.formats, LineItem.geo, LineItem.production, LineItem.shortfall_remedy, ProductionOption.build_owner, ProductionOption.cost, ProductionOption.custom_unit, ProductionOption.lead_time