Repository navigation
docs(governance): ratify DR-0034 (major-only requests serve the oldest release) and record DR-0035 - #8410
Conversation
…de-path review rule - DR-0032 (proposed, normative): SDKs translate between 3.x releases; reads drop and report, mutations refuse lossy conversion; reduced account keys stay one-to-one, with an explicit migration when the seller upgrades. - DR-0033 (proposed, normative): every 3.x change states its pathway to the previous minor release. - DR-0034 (proposed, breaking, for escalation): major-only requests are served the oldest supported release, superseding DR-0024's unpinned clause. - LADON.md and the constitution enforce the downgrade-path rule in review. Refs #8373. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ors; record adcp_major_version removal - DR-0033 now covers every minor release within a major (4.1 → 4.0 as well as 3.3 → 3.2): minors are non-breaking and backward compatible. - DR-0035 (recorded) states the existing decision that adcp_major_version and adcp.major_versions are deprecated through 3.x and removed in 4.0. - DR-0034 is scoped to 3.x. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Adds a reminder to the 3.3 release notes, a 3.2 → 3.3 upgrade checklist row and a Deprecations note pointing at DR-0035. Not a new deprecation. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
On DR-0032, DR-0033, and DR-0034: the translation layer solves a problem that the versioning rule should prevent. adcp-client#3372 notes that 3.0 and 3.1 requests are valid in the 3.2 shape. The adapters exist for four 3.2 changes that weren't additive: I propose one rule for minors instead:
With that rule:
The review rules in adcp-client-python#1563, adcp-client#3380, and adcp-go#591 already enforce DR-0032 and DR-0033 before ratification. I ask that they be marked pending this PR. For 4.0, a stable core with modules keeps the rule sustainable. New vocabulary lands in a module's own version, so core has no reason to break. |
|
This PR proposes three rules for differences between 3.x minor releases. SDKs translate between them (DR-0032). Every change documents a way back to the previous minor (DR-0033). A request that only says "version 3" gets the oldest 3.x release (DR-0034). DR-0034: yes, as a stopgap for 3.x, and I need to correct what I said earlier. I wrote that serving the newest release is safe because receivers ignore fields they don't know. That's wrong for some objects. 3.0 published them as closed, meaning a validator must reject any field it doesn't know, and later minors added fields to them. For example, the brand reference gained That's the underlying problem: some minor releases weren't purely additive. Translation in every SDK repairs that after the fact, and every new break needs more translation. I'd rather stop the breaks. #8502 adds one CI check that fails any change that removes something or adds a field to a closed object. Run against past releases, the check finds 79 such changes in 3.1 and 70 in 3.2, not counting experimental features. #8501 explains why our rules disagree: DR-0009 says schemas are open so that minors stay safe, while DR-0019 allows adding fields to closed schemas in a minor. So I object to treating DR-0032, DR-0033 and the shared translation vectors (#8433) as settled. Please bring them back to the agenda. |
|
WG Session C (2026-10-26): DR-0034 is ratified: a major-only request ( |
WG Session C (2026-10-26): - DR-0034 accepted: a major-only request is served the oldest supported release of the major (3.0), dissent none. The versioning docs and the version-negotiation spec table now state the rule. - DR-0035 stays recorded. - DR-0032 and DR-0033, with the LADON.md and constitution rules that enforce DR-0033, move to #8519, parked pending #8501. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
| decided: 2026-10-26 | ||
| decided_by: WG Session C, 2026-10-26 | ||
| refs: ["#8373", "#8410", "DR-0024", "DR-0035"] | ||
| supersedes: DR-0024 |
There was a problem hiding this comment.
Medium: supersedes: DR-0024 here, and the Decision says this "replaces only the 'Unpinned requests' paragraph of DR-0024" — but DR-0024 is not touched by this PR. Its ## Decision still reads: "A request with no adcp_version, or with only adcp_major_version, is served at the default or highest release" (DR-0024:25). Two ratified records now give opposite answers for the major-only case (highest vs oldest), and DR-0024 carries no marker that it was superseded. Per the records README, supersession keeps the file but adds superseded_by and the superseding record replaces the stale text. Update DR-0024:25 to point at DR-0034 (or restate the oldest rule) and add superseded_by: DR-0034 so a reviewer citing DR-0024 §Unpinned requests doesn't get the superseded answer.
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — Breaking-class ratification requires human review.
This PR ratifies DR-0034 and records DR-0035, which governs removal of AdCP major version negotiation in 4.0 and changes the "oldest supported release" rule for major-only requests across versioning.mdx, version-negotiation.md §4, and the migration/release-notes docs. Per the repo's hard gate, a Breaking-class protocol change — even a clean one — is never auto-approved: ratification is a human act, and must escalate unless review_decision is APPROVED. Here review_decision is REVIEW_REQUIRED, so the gate stands.
Escalation reasons
- Ratification of DR-0034 / DR-0035 governs removal of major-version negotiation in 4.0 — a Breaking-class protocol policy decision requiring human ratification;
review_decisionis REVIEW_REQUIRED, not APPROVED. - DR-0034 asserts it supersedes DR-0024's "Unpinned requests" rule, but DR-0024 is untouched and still reads "default or highest release," leaving two ratified records in direct contradiction with no
superseded_bymarker — a governance-record coherence gap a human should resolve before merge.
Medium findings
- governance/decisions/DR-0034-major-only-requests-are-served-the-oldest-release.md:10 — DR-0034 supersedes DR-0024 but leaves DR-0024's contradictory "highest release" rule unmarked.
The docs/spec changes are internally consistent (anchors, upgrade-row numbering, §4 table all resolve), the changeset is present and in-scope, and there is no schema↔docs drift. But the Breaking-class governance gate is semantic and prose-based, not satisfied by a clean diff.
Medium findings
- governance/decisions/DR-0034-major-only-requests-are-served-the-oldest-release.md:10 — DR-0034 supersedes DR-0024 but leaves DR-0024's contradictory "highest release" rule unmarked
Why human review
- Ratifies DR-0034 / records DR-0035 governing removal of major-version negotiation in 4.0 — a Breaking-class protocol policy decision requiring human ratification; review_decision is REVIEW_REQUIRED, not APPROVED
- DR-0034 claims to supersede DR-0024's 'Unpinned requests' rule but DR-0024 is untouched and still asserts 'default or highest release' — two ratified records contradict each other with no superseded_by marker
|
Updated for WG Session C (2026-10-26), head
CI is green. Ready for a human merge. |
Split out of #8410. DR-0032 (SDKs translate between minor releases; mutations refuse lossy conversion; reduced account keys stay one-to-one) and DR-0033 (every minor-release change states its pathway back), with the LADON.md and constitution rules that enforce DR-0033. Both stay proposed: WG Session C (2026-10-26) parked them until #8501 is settled. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Shared cases every SDK runs for translation between consecutive minor releases (proposed DR-0032 / DR-0033), starting with 3.2 <-> 3.1: client request down-conversion and response up-conversion, server response down-conversion, lossy-mutation refusals, exact moves, negotiation, and one-to-one account-key reduction with migration after a seller upgrade. Expected values generated from @adcp/sdk and reviewed by hand. Refs #8373, #8410. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Decision records on AdCP version handling, from #8373. Updated after WG Session C (2026-10-26).
What this PR carries
adcp_major_versionis served the oldest supported release in that major: 3.0 foradcp_major_version: 3. A buyer that wants newer behavior sendsadcp_version.docs/reference/versioning.mdx(the "Omitted" rule, the major-only example, the in-house-client note) and the §4 table inspecs/version-negotiation.mdnow state the rule.adcp_major_versionandadcp.major_versionsare deprecated through 3.x and removed in 4.0, writing down a decision the schema and docs already state.Moved out
DR-0032 and DR-0033 were not ratified; they're parked until #8501 is settled. They now live in #8519 (draft), together with the
LADON.mdmandatory check and the constitution invariant that enforce DR-0033. As a result this PR no longer touchesLADON.mdor the constitution.🤖 Generated with Claude Code