Skip to content

[Change] § 5.6.2 — Let a seller cap concurrent holds per buyer, and admit hold requests like commitments #156

Open

Description

@pkanna000

What kind of change?

Add a new field

Which section?

5.6 — Commercial terms

Current text

§ 5.6.2 hold_status: hold_available, hold_duration, hold_scope, state, hold_expires_at.
PR #143 restructures this into hold_terms { available, duration } and hold, where hold.held_availability is "what the seller reserves".

Neither ties a hold request to a buyer the seller could accept a commitment from, or lets a seller state how many holds one buyer may have at once.

Proposed text

Add to hold_terms (PR #143), or to hold_status if #143 does not land:

max_concurrent (Integer, OPTIONAL): the most holds this seller grants one buyer at once, counted across the seller's line items in hold status held.

1. A seller MUST NOT grant a hold to a requester it would not admit to a commitment on that line item (§ 5.8, PR #139).
2. A request that would exceed max_concurrent is declined (PR #143) with a reason (§ 2.4, PR #138).
3. A seller that offers holds on a visibility: public line item SHOULD set max_concurrent.

Why

Interest declaration: filing in an individual capacity; views are my own. I'm an enterprise architect with 27 years in software, the last four in advertising technology, working on the governance and security of AI agent systems.

Under #143, a held line item reserves inventory (held_availability) with no money changing hands. A human buyer asks for a few holds. A buying agent can ask for one on every line item it screens, at machine speed, and convert one of them. An agent stuck in a retry loop does the same thing by accident. Either way, other buyers lose access to the inventory.

Today a seller can only defend with transport rate limits that buying agents can't see. They'd learn the limit by failing, and nothing makes a hold requester as accountable as a committing buyer.

At least one sell-side agent in the IAB Tech Lab Agent Registry already places a 72-hour inventory hold when a proposal is finalised (registry snapshot, 5 Nov 2026).

Knock-on effects

Would this break an implementation already built to this draft?

No — additive or editorial

Alternatives you considered and rejected

  • Transport rate limits only. They're invisible to buying agents and can't express a per-buyer inventory policy.
  • Deposits for holds. That belongs in binding terms, not the object.
  • Rely on buyer-side discipline. A seller can't verify it.

Glad to supply the PR diff on top of #143 once the direction is agreed.

You are commenting as

Individual, no organisational position

Before you submit

  • I have read CONTRIBUTING.md and agree my contribution may be published under this repository's licence.
  • This contains no confidential or commercially sensitive information.

Activity

  1. KonstantinMirin commented on Nov 6, 2026

    @KonstantinMirin

    Postindustria (IAB Tech Lab member). Thanks, @pkanna000. A declared cap fixes a real problem: an agent shouldn't learn a limit by failing.

    We'd keep max_concurrent out of hold_terms, though. It counts holds across all of a seller's line items, so it's seller policy, not a term of one line item. The manifest (§ 2.3) is the draft's one seller-level document, and the natural home.

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

  2. premesh commented on Nov 7, 2026

    @premesh

    +1 to a declared cap in the manifest. One OOH note: holds are usually placed by an agency for several advertisers, so a cap counted per requesting buyer would throttle an agency holding for ten clients. Suggest the manifest cap can be counted per advertiser as well as per buyer seat.

  3. pkanna000 commented on Nov 7, 2026

    @pkanna000
    Author

    Thanks, @KonstantinMirin and @premesh.

    Agreed on the three rules: #140's issued-proposal gate covers rule 1, and rule 3 follows from it. For rule 2, a plain decline is enough once the cap is published, because a buyer can count its own holds. I'll take max_concurrent out of hold_terms.

    Proposed text for the manifest (§ 2.3), with @premesh's per-advertiser count:

    Add to ProposalManifest: hold_limits (HoldLimits, OPTIONAL), the most holds the seller grants at once across its line items. A seller that limits concurrent holds SHOULD declare the limit here.

    Key Type Required Meaning
    per_buyer Integer OPTIONAL Holds in status held on proposals issued to one buyer.domain
    per_advertiser Integer OPTIONAL Holds in status held for one advertiser, counted by the commitment.advertisers[] in a hold's requested_terms. A hold that names several advertisers counts once for each
    • A seller declines a hold request that would exceed a declared limit (§ 5.6.2).
    • Holds that move as a unit under linked_execution: all count as one.
    • Lowering a limit doesn't release a hold already granted.
    • A seller that declares hold_limits publishes the manifest even when proposals[] is empty.

    One gap: requested_terms is OPTIONAL in #143, so a hold need not name an advertiser, and per_advertiser can't count it. I'd let a seller that sets per_advertiser decline a hold request whose requested_terms names no advertiser. The alternative, counting such a hold only against per_buyer, lets an agency get round the per-advertiser limit by leaving the advertiser out.

    Would you carry this in #143?

  4. KonstantinMirin commented on Nov 7, 2026

    @KonstantinMirin

    Thanks, @pkanna000. Yes: our holds PR (#143) now carries hold_limits in § 2.3 as you proposed, with @premesh's per-advertiser count. It takes your fix for the gap too: a seller that declares per_advertiser MAY decline a hold request whose requested_terms names no advertiser.

    Two notes from the rest of our stack:

    • Our packages PR (#154) replaces linked_execution, so there the holds on a package's line items count as one.
    • Our signing PR (#142) makes advertisers[] REQUIRED. With it, a hold names no advertiser only when it carries no requested_terms.

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

  5. pkanna000 commented on Nov 8, 2026

    @pkanna000
    Author

    Thanks, @KonstantinMirin. I've read § 2.3 in #143 and it says what I intended, including the fix for holds that name no advertiser. Counting a package's holds as one under #154 makes sense. Nothing further from me on this issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions