Decision records · Value formats
D-038 In which time zone are a line item's calendar values read, its daypart windows, its frequency cap's period, and the days of its flight?
What the schemas do
One clock per line item reads its daypart windows and its frequency cap's period, as the time_zone of #123 does. The schemas add no such field until the text has it. A Timestamp, a flight's start and end included, stays an RFC 3339 instant with an offset, which needs no clock.
Options
Why
A daypart window and a frequency cap's period are calendar values: a window is a time of day and a period resets at a calendar boundary (D-044), and both move with daylight saving time, which an offset doesn't record. Ad servers read them in one time zone per line item, and an IANA name records daylight saving time where an offset doesn't. RFC 9557 suffixes put a zone on each value, which lets two values of one line item disagree, and few JSON Schema validators check them. A zone per daypart window has the same defect. On main the specification has no time_zone field, so the schema adds none. The open PR that adds time_zone makes it the clock for the daypart and the frequency cap's period only, with viewer_local beside the IANA names, and with it the schema types the field from the text. Neither text says which clock reads a flight: the examples write flight_start and flight_end as calendar dates, which name no instant until a zone reads them, and the schema writes them as Timestamps (D-042), which need none. So the flight's clock stays open on both locks.
What we ask the specification to state
Adopt the line item time_zone that #123 adds, an IANA zone name or viewer_local, as the clock for daypart and frequency_cap.period. One clock is still open. The examples write flight_start and flight_end as calendar dates. Say which zone reads their days, or write them as RFC 3339 date-times with an offset, which need no zone.
The specification lines it rests on
Each line is quoted as the record pins it. Expand an item to read the quote.
main
§ 5.5, the
daypartrow L260 at 44dfaafdaypart| Object | settable |allowed[]of time windows§ 5.5, the
frequency_caprow L261 at 44dfaaffrequency_cap| Object | settable |{ max: { min, max }, period, basis: device | household | listener }. Basis matters: CTV typically caps at household, audio at listener§ 5.6.1, the
commitment.flight_startkey row L294 at 44dfaafflight_start| REQUIRED | The buyer's campaign start. Distinct fromvalid_from§ 5.6.1, the
commitment.flight_endkey row L295 at 44dfaafflight_end| REQUIRED | The buyer's campaign end. Distinct fromvalid_until
With the open PRs
§ 5.6.1, the
commitment.flight_startkey row L287 on main at 981a74eflight_start| REQUIRED | The buyer's campaign start. Distinct fromvalid_from§ 5.6.1, the
commitment.flight_endkey row L288 on main at 981a74eflight_end| REQUIRED | The buyer's campaign end. Distinct fromvalid_until
What it shapes
main: DaypartWindow, Commitment.flight_end, Commitment.flight_start, LineItem.daypart, LineItem.frequency_cap