Skip to content

§ 4.1, § 5.6.1 — Commitments carry proposal_id and version (#24) - #73

Draft
Kishore-2572 wants to merge 3 commits into
mainfrom
spec/24-commitment-version
Draft

Kishore-2572 wants to merge 3 commits into
mainfrom
spec/24-commitment-version

Conversation

@Kishore-2572

@Kishore-2572 Kishore-2572 commented Oct 22, 2026 •

Copy link
Copy Markdown

Draft. Do not merge until the working group confirms the disposition of #24.

What this changes

A commitment now names the proposal and version it was priced against (proposal_id, version, § 5.6.1). The seller rejects a new commitment attempt on a stale version, past valid_until, or past the price_valid_until of the pricing[] entry it is priced against, and returns the current version so the buyer can fetch it again. These checks depend only on the stored proposal and the time the seller receives the attempt. A replay of an attempt already processed (same idempotency_key, same body) returns the stored result, acceptance or rejection, without re-running those checks, and the same key with a different body is an explicit conflict, as @aleksUIX suggested on #24. idempotency_key values are opaque and scoped to one buyer and seller pair, in line with iab-agentic-primitives FD-12. § 4.1 states that each revision of the proposal increments version.

Related issue

Refs #24. #23 (draft PR #70) relies on these version rules for "same proposal and version".

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
  • Appendix A (field index) matches the body — no new rows, as the new keys sit inside commitment; scripts/check_appendix.py passes
  • Appendix B (fields by marker, and the counts) matches the body — counts unchanged
  • Any affected example in examples/ is updated and still parses — the display, CTV and audio commitments carry proposal_id and version; § 6.3 points to the CTV example
  • RFC 2119 keywords used deliberately — MUST / SHOULD / MAY are not synonyms
  • The no-inheritance rule (§ 2) still holds
  • 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


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

A commitment names the proposal and version it was priced against
(§ 5.6.1). The seller rejects a new attempt on a stale version, or past
valid_until or price_valid_until, and returns the current version. An
authenticated replay with the same idempotency_key and terms returns the
stored result without re-running those checks; the same key with
different terms is a conflict. Keys are opaque and scoped to one buyer
and seller pair. § 4.1 states that each revision while published
increments version.

The display, CTV and audio examples carry proposal_id and version.

Refs #24
The specification does not define authentication yet (WS1; see #62),
so the replay rule now applies to a replay from the same buyer rather
than an authenticated replay.

Refs #24
@KonstantinMirin

Copy link
Copy Markdown

Postindustria (IAB Tech Lab member). @Kishore-2572, thanks for folding in @aleksUIX's replay wording. Four points:

  • "Same commitment terms" has no definition. Your reply on #24 and the replay rule in IAB's agentic primitives (FD-12) compare the body. Suggested: "the same body: every value the buyer sent with the attempt except idempotency_key". A rejection is stored too, so a retry on a new version needs a new key.
  • version row. "While status is published" leaves out a seller counter during under_review, so a buyer could commit at an unchanged number to changed terms. "Each revision increments it" covers that and leaves what counts as a revision to #64.
  • "As for idempotency_key" points to nothing: no idempotency text says "deterministic". Suggested: "These checks depend only on the stored proposal and the time the seller receives the attempt."
  • pricing[].price_valid_until names no entry. Suggested: "the committed pricing[] entry's price_valid_until". #94 names that entry with commitment.pricing_id.

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

From the Postindustria review on #73:
- a replay matches on the same body, every value the buyer sent except
  idempotency_key, and returns the stored result whether an acceptance
  or a rejection; a retry against a new version uses a new key;
- version increments on each revision of the proposal, not only while
  published, so a counter under review also moves it;
- "deterministic" now says what the checks depend on: the stored
  proposal and the time the seller receives the attempt;
- the price check names the pricing[] entry the commitment is priced
  against.

Refs #24
@Kishore-2572

Copy link
Copy Markdown
Author

Thank you, @KonstantinMirin. All four are in the latest commit: the replay rule now matches on the body (every value except idempotency_key) and replays a stored rejection too, so a retry on a new version uses a new key; version increments on each revision, leaving what counts as one to #64; the checks are defined as depending only on the stored proposal and the receive time; and the price check names the pricing[] entry the commitment is priced against. How a commitment identifies that entry is left to #94, listed under knock-on effects.

@KonstantinMirin

Copy link
Copy Markdown

Thank you, @Kishore-2572. Postindustria (IAB Tech Lab member) checked 0b90fd4, and all four points are in. They are the replay body and stored rejection, the version row, "deterministic" defined, and the pricing[] entry named. As in #63's binding record, the body leaves out idempotency_key.

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

@Kishore-2572

Copy link
Copy Markdown
Author

Thanks for checking, @KonstantinMirin.

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.

2 participants