The gap
docs/ir-design.md:671-672 already names this one as "a gap expected to close": the 2020-12 content vocabulary's contentSchema has no home at any position, while contentEncoding and contentMediaType reach Encoding.Name / Encoding.MediaType.
Why it is worth closing
contentSchema is the keyword that says what a string-encoded payload is once decoded — the schema of the thing inside a base64 blob or a application/json-typed string. Without it, a consumer sees an opaque string where the source declared a full shape.
It also completes a vocabulary that is otherwise two-thirds modelled, which is an awkward place to stop: a consumer has to special-case one of the three keywords.
Scale
Small but concrete: it is the difference between half and all of oasdiff's media-type family for a downstream consumer, and it accounts for 4 breaking-change checks that cannot be implemented from typed IR.
Found by a study of dexpace/spaceapi adopting morphic IR as its input format (spaceapi#56), 2026-09-05. Related: #418 (non-emitter consumer), #419 (cross-revision identity).
The gap
docs/ir-design.md:671-672already names this one as "a gap expected to close": the 2020-12 content vocabulary'scontentSchemahas no home at any position, whilecontentEncodingandcontentMediaTypereachEncoding.Name/Encoding.MediaType.Why it is worth closing
contentSchemais the keyword that says what a string-encoded payload is once decoded — the schema of the thing inside a base64 blob or aapplication/json-typed string. Without it, a consumer sees an opaque string where the source declared a full shape.It also completes a vocabulary that is otherwise two-thirds modelled, which is an awkward place to stop: a consumer has to special-case one of the three keywords.
Scale
Small but concrete: it is the difference between half and all of oasdiff's media-type family for a downstream consumer, and it accounts for 4 breaking-change checks that cannot be implemented from typed IR.
Found by a study of
dexpace/spaceapiadopting morphic IR as its input format (spaceapi#56), 2026-09-05. Related: #418 (non-emitter consumer), #419 (cross-revision identity).