Skip to content

§ 5.8, § 5.10 — Relationship and contract references: terms_ref, agreement_ref (#27) - #75

Draft
Kishore-2572 wants to merge 2 commits into
mainfrom
spec/27-agreement-terms-refs
Draft

Kishore-2572 wants to merge 2 commits into
mainfrom
spec/27-agreement-terms-refs

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 #27.

What this changes

A line item can now point at the agreement and the exact terms it is executed under, without the specification modelling contracts. terms_ref (§ 5.8, { url, sha256, version }) names the legal terms or IO template the buyer accepts at assent; it is REQUIRED when terms_acceptance_required is true, and hash-pinned and frozen at agreed. agreement_ref (§ 5.10) is an informative pointer to the master or annual agreement a line item is priced under. external_references[] documents two role values, io and agreement. § 5.10 states that IO generation is a connector concern, and § 7 adds a non-normative note: relationships are issued proposals plus the buyer agent's business rules.

Related issue

Refs #27. Related: #26 (draft PR #74), where buyer-specific terms live on issued proposals.

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 — two rows; scripts/check_appendix.py passes
  • Appendix B (fields by marker, and the counts) matches the body — seller-set 29 → 31; 71 → 73 fields
  • Any affected example in examples/ is updated and still parses — terms_acceptance_required and terms_ref in line-item-display.yaml
  • RFC 2119 keywords used deliberately — MUST / SHOULD / MAY are not synonyms
  • The no-inheritance rule (§ 2) still holds — both fields sit on the line item
  • 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.

§ 5.8 adds terms_ref ({ url, sha256, version }), REQUIRED when
terms_acceptance_required is true, hash-pinned and frozen at agreed, so
assent binds to an exact document. § 5.10 adds agreement_ref, an
informative pointer to the master or annual agreement a line item is
priced under, and documents the io and agreement roles on
external_references[]. IO generation is stated to be a connector
concern, and § 7 adds a non-normative note on relationships.

agreement_ref is seller-set; a buyer-held agreement id travels as an
external_references[] entry with role: agreement, so the field keeps
one marker (§ 3).

Appendix A gains two rows; Appendix B counts seller-set 29 → 31 and
73 fields. The display example carries terms_ref.

Refs #27
agreement_ref.parties used buyer_id, which the specification does not
define. parties[] now names the seller by its seller_id and the buyer
by the id it holds in eligible_bidders[] (section 5.8).

Refs #27
@KonstantinMirin

KonstantinMirin commented Oct 25, 2026 •

Copy link
Copy Markdown

Postindustria (IAB Tech Lab member). @Kishore-2572, our PRs carry #75 and change terms_ref and agreement_ref as follows:

  • Name the field digest. A field name never names the algorithm, so the value carries it: sha256: + lowercase hex, the form record_digest (#63) already uses. Our shared types PR defines it once, as Digest in § 2.2. For a document, the input is the exact bytes served at url, with no content coding.
  • Use one type, DocumentRef. It requires only url and digest, and stays open, so its publisher can add a version or a date. Every pinned document uses it, including a block list on #71 in place of list_ref.
  • Make it an array. In our PR on what is signed, terms_refs[] lets a seller send a main agreement and its addenda. Every entry applies, with no AND or OR.
  • Keep the documents. The seller keeps every published version retrievable. The buyer stores a copy and compares it with its digest before it commits.
  • Acceptance. The buyer's commitment entry in assent[] carries record_digest, which covers each terms_refs[] digest. That entry accepts every listed document at those exact bytes. With no terms_refs[], it accepts none.
  • Drop terms_acceptance_required. A non-empty terms_refs[] already says it.
  • Rename agreement_ref to agreement. The suffix _ref is kept for DocumentRef and EntryRef. agreement stays an informative pointer. A term, an Interval, replaces valid_from and valid_until. type becomes agreement_type, an open vocabulary. parties[] holds Party objects, as in our parties PR. An optional document pins the agreement as a DocumentRef.
  • Binding record. terms_refs[] and agreement are seller-set, so record_digest covers both. external_references[] are not terms, so an order or line id can arrive after agreed. In our post-agreement PR, role becomes reference_type, and io becomes order or line.

Revised 2026-11-03: Rewritten to match our PRs. We withdraw the point that § 3 makes "frozen at agreed" redundant.

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

@KonstantinMirin

Copy link
Copy Markdown

Postindustria (IAB Tech Lab member). @Kishore-2572, our parties PR carries this PR at its head. Its last commit renames agreement_ref to agreement, with a key table, and parties[] holds Party objects.

Our PR on what is signed turns terms_ref into terms_refs[] of DocumentRef and drops terms_acceptance_required. Our post-agreement PR renames role to reference_type.

Our revised comment above has the detail. Could you review them there?

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.

2 participants