Skip to content

§ 2, § 4.1.4, § 5.6.3 — Packages: line items sold only together, in place of requires and linked_execution - #154

Open
KonstantinMirin wants to merge 413 commits into
IABTechLab:mainfrom
KonstantinMirin:op30-packages
Open

KonstantinMirin wants to merge 413 commits into
IABTechLab:mainfrom
KonstantinMirin:op30-packages

Conversation

@KonstantinMirin

@KonstantinMirin KonstantinMirin commented Nov 5, 2026 •

Copy link
Copy Markdown

What this changes

The draft links line items in two ways, and neither keeps a line item about itself. linked_execution has one value, all, so it works as a Boolean for the whole proposal. requires lets a line item name others, so their state reaches it:

  • A line item can become non-committable because a line item it names sells out.
  • Its visibility follows theirs.
  • After agreed, cancelling a named line item invokes the dependent line item's cancellation_policy.
  • If A requires B and B requires C, buying A requires C, unnamed.

This PR puts what spans line items one level up, on a package that holds them.

  • § 4.1: a proposal holds line_items[] or packages[], not both.
  • § 4.1.4: a Package holds line_items[], sold only together, and add_ons[], sold only with all of them once its min_commitments[] are met. A line item sold alone is a package of one, and a proposal sold only whole is one package.
  • § 4.1.4: a commit that names part of a package, or an add-on without its package, returns not_committable.
  • § 5.6.3: a bonus line item is an add-on, priced on its own.
  • § 5.6.2: the holds on a package's line items move as a unit, and § 2.3 counts them once against hold_limits.
  • § 4.1.4: a buyer cancels an agreed package's line items only together. A notice on only some of them exercises no option.
  • § 2.1 and § 2.3: ProposalSummary lists packages in place of has_requires.
  • § 4.1.1 and § 5.8: the binding record and a response keep a line item's package.
  • requires and linked_execution are removed.

Related issue

Refs #23 and #6 (OQ-5). Refs #50, #86, #103, and #106.

Builds on

This PR builds on our formats PR, the last of our stack, so applying all 17 in order gives the final text. It replaces the requires and linked_execution of #70 by @Sirajmx, which our PRs carry; our comment on #70 says why. Review the commits "Replace requires and linked_execution with packages", "Count a package's holds once against hold limits", and "Cancel an agreed package's line items only together".

Type

  • Editorial — no normative effect
  • Normative — changes what the spec requires
  • Breaking — would break an implementation already built to this draft
  • Examples / schema / docs only

Checklist

  • The body section is updated — § 2, § 2.1, § 2.3, § 2.4, § 4.1, § 4.1.1 to § 4.1.4, § 5.6, § 5.6.2, § 5.6.3, § 5.8, § 6.1, § 6.5, § 6.6, and § 8 question 5, with OQ-5 in docs/open-questions.md
  • Appendix A (field index) matches the body. linked_execution and requires go, and packages[] comes. scripts/check_appendix.py passes: 96 field names, 98 rows
  • Appendix B (fields by marker, and the counts) matches the body — seller-set 46 → 45; 99 → 98 fields; 27 touched by the buyer
  • Any affected example in examples/ is updated and still parses. examples/proposal-package.yaml holds the CTV and audio line items of proposal.yaml as a package, with the CTV bonus as its add-on, and the bonus leaves proposal.yaml. manifest.json is regenerated, and neither record_digest changes. scripts/check_examples.py checks one shape per proposal, unique ids, the Package keys, thresholds on the package's own line items, and that a line item in both proposals is the same. All three checks pass
  • RFC 2119 keywords used deliberately — MUST / SHOULD / MAY are not synonyms
  • The no-inheritance rule (§ 2) still holds — no line item names another, and a package holds only its line items and thresholds
  • Anything selectable declares available[] and included[]; anything settable declares bounds (§ 3.1, § 3.2) — no new selectable or settable fields
  • No confidential or commercially sensitive content

Knock-on effects

Open questions

  1. What does cancelling one line item of an agreed package do to the rest? @premesh answered on #6: OOH usually cancels a package whole. § 4.1.4 now cancels its line items only together, each under its own cancellation_policy, since a package holds no terms (question 2). § 8 question 5 asks only whether a package covers every bundle sellers sell.
  2. Should a package carry terms its line items share? @premesh suggested one exclusivity term for a domination on [Change] § 5.9, § 5.6, § 2.1 — Add delivery_type: guaranteed, share_of_voice, non_guaranteed #93, then preferred a term on each line item, inside the package, because static and digital faces often take different terms. This PR adds none.

Contribution Terms

Analyzed and generated with the help of Claude, fully reviewed by me.

The manifest's hold_limits states the most holds a seller grants at once, per
buyer domain and per advertiser. A seller declines a request over a declared
limit, and under a per-advertiser limit may decline one that names no
advertiser.
Where a value whose Type cell is String conflicts with a typed field of the
same version in the binding record, the typed field governs. Identifiers and
codes are excluded, and an Enum or shared-type value is a typed field.
A line item's preemption MAY state a remedy, from an open vocabulary with the
core terms makegood, credit, and none. It settles the delivery a preemption
takes on any delivery_type, in place of shortfall_remedy, so a preempted
share-of-voice buyer knows what it gets before committing.
When a line item's preemption states a remedy, the delivery a preemption takes,
less any replacement within the flight, is a shortfall on any delivery_type. It
settles as though that remedy were the only option in effect at commit, under
the remedy_terms of shortfall_remedy. When none is in effect in
shortfall_remedy, it must be the only option. Section 8 question 10 adds how
much delivery a preemption takes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant