Summary
RFC 0172 §A.1 makes preferredVersion a required v2 root field and its §A.3 makes it the header-less default for major negotiation; RFC 0176 §C.1 keys the well-known representation on it; RFC 0168 §D.3 defaults the suite's --target-major from it. RFC 0172 §Compatibility said the v1.x additive half "is filed separately" and nothing filed it. This RFC is that half.
Motivation
schemas/capabilities.schema.json carries preferredVersion only under a2a and mcp (:2898, :3390); no v1 host can advertise the root field; a dual-advertising host through the overlap would have protocolVersions: ["1.11", "2.0"] and no way to say which it serves without a header.
Proposal
§A.1 preferredVersion (string, RFC 0165 §A grammar ^(0|[1-9][0-9])\.(0|[1-9][0-9])$) is an OPTIONAL root field in v1.x. When present it MUST be a member of protocolVersions[] (when that is present) and, on a host serving a single major, MUST equal protocolVersion. §A.2 A v1 consumer ignores it. A v2 consumer (suite 2.0.0) reads it as the header-less default; absent, the consumer's default is max(protocolVersions[]), else protocolVersion. §A.3 The A2A precedent (a2a-integration.md:349, the preferredVersion card served without an A2A-Version header) is the model.
Compatibility
additive. The v1 suite adds no assertion; the schema accepts documents with or without the field.
Conformance
Suite 1.163.0: schema acceptance only (spec-corpus-validity compiles the field). Suite 2.0.0: dual-stack-negotiation (RFC 0172) reads it.
Falsifiability — one row per normative requirement
| Requirement | Observable | Who can cause the condition | Verdict |
|---|---|---|---|
§A.1 member of protocolVersions[]; equals protocolVersion on a single-major host | openwop.requirement.0172.preferred-version-default — its .member leg asserts both clauses by name, executed-pass on BOTH certified bundles | the suite, unaided | witnessable — unaided |
Alternatives considered
- Default
--target-majorfrommax(protocolVersions[])only. Kept as the fallback; a host that serves two majors and prefers the older one cannot say so without the field.
Unresolved questions
None.
Acceptance criteria
- [x]
Draft → Active: schema field; capabilities.md row; suite 1.163.0. (This PR.) - [x]
Active → Accepted: openwop-app advertises it (Phase 4 leg) and the 2.0.0dual-stack-negotiationscenario reads it. — evidence: both halves, measured 2026-09-18T06:08Z.GET https://app.openwop.dev/.well-known/openwopwithOpenWOP-Version: 2.0serves"preferredVersion": "1.1"inside"protocolVersions": ["1.1", "2.0"]; MyndHyve corroborates with"preferredVersion": "1.0"in["1.0", "2.0"].openwop.requirement.0172.dual-stack-negotiationisexecuted-pass(4 legs) and…preferred-version-defaultexecuted-pass(3 legs) on BOTH certified bundles. Recorded honestly: openwop-app's own bundle also carries those rows, but it is not certified (3 blocked rows, RFC 0168 §E.1), so it supplies no §B.1 witness — the witnesses are the reference and MyndHyve bundles, and the advertisement half is the live fetch above.
References
- RFC 0165 §A; RFC 0172 §A.1/§A.3/§Compatibility; RFC 0176 §C.1; RFC 0168 §D.3;
spec/v1/a2a-integration.md:349