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 385 commits into
IABTechLab:mainfrom
KonstantinMirin:op30-packages
Open

KonstantinMirin wants to merge 385 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.

By opening this pull request I agree my contribution may be published under this
repository's licence, as set out in CONTRIBUTING.md.

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

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