open-standards/wai/extensions/capability-constraints.md
Transaction Science b912d6faa8
Some checks failed
no-vanity-metrics / Scan committed Markdown for vanity metrics (pull_request) Successful in 3s
standards workspaces build + test / aac-rs (pull_request) Successful in 38s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 43s
standards workspaces build + test / eoc-rs (pull_request) Successful in 1m49s
standards workspaces build + test / jcp-rs (pull_request) Successful in 1m13s
standards workspaces build + test / proof-rs (pull_request) Successful in 1m11s
standards workspaces build + test / sandbox-rs (pull_request) Successful in 2m0s
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 5m8s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 43s
standards workspaces build + test / map-rs (pull_request) Successful in 39s
standards workspaces build + test / smart-byte-rs (pull_request) Successful in 2m34s
standards workspaces build + test / mesh-rs (pull_request) Successful in 1m30s
WAI conformance / cargo-class corpora · linux (pull_request) Successful in 31s
WAI conformance / cross-arch byte-equality · linux (pull_request) Successful in 14s
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Successful in 40s
standards workspaces build + test / openpay (pull_request) Successful in 3m51s
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Successful in 1m16s
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Successful in 30s
standards workspaces build + test / arl-rs (pull_request) Successful in 9m17s
standards workspaces build + test / joule-ui-rs (pull_request) Successful in 10m26s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 11m6s
standards workspaces build + test / joulehook-rs (pull_request) Successful in 12m27s
standards workspaces build + test / sense-rs (pull_request) Successful in 11m33s
WAI conformance / cargo-class corpora · macos (pull_request) Successful in 1m30s
WAI conformance / cross-arch byte-equality · macos (pull_request) Successful in 22s
WAI conformance / cargo-class corpora · windows (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · windows (pull_request) Has been cancelled
dispatch: capability constraints, and delivery over bearers that cannot answer
Two seams the tree could not express, both surfaced by the landscape survey.

CAPABILITY CONSTRAINTS. WAI dispatch treats support as binary — a sink either
claims a capability or does not. Real sinks support a codec TO A LEVEL: up to a
resolution, a frame rate, a bit depth, a profile. "This capability, but only to
4K60 10-bit, this profile" is the normal case and was unexpressible, so partial
support failed at DECODE time rather than SELECTION time, and rendition selection
had nothing to evaluate and deferred to a deployer policy the spec never states.

Ingests the constraint-set grammar and register pattern from AMWA's ratified
Receiver/Sender Capabilities work (BCP-004-01 / -02, v1.0.0) — ORed sets of
enum/min/max constraints over register-named parameters. Grammar and pattern
only: not the transport, not the discovery model, and explicitly NOT the
pre-flight negotiation framing, because capability-plus-budget binding before
execution is already owned by JCP and two mechanisms for one job is worse than
none.

The honest limit is stated in §3 rather than hidden: the ratified registers are
broadcast-essence-shaped and cover only WAI's conventional media families. There
are no entries for neural, quantum, world or haptic, and WAI must author those
itself — until it does, those capabilities remain unconstrained, which is the
true state rather than a pretended one.

UNIDIRECTIONAL DELIVERY. Three assumptions quietly presume the sink can talk
back: jwp-receipts assumes relay-chain linkage, targeting presumes the source
learns something about the sink, and pre-emption has no signer class because
nothing in WAI has needed to assert authority over a sink before. Terrestrial
broadcast, satellite and multicast object carriage break all three, and none is
repaired by defining a bearer.

  * Sink-evaluated predicates (§2): the object carries a condition the SINK
    evaluates against local state the source never learns, under a
    predicate-equivalence contract in the shape of state-feeds §3. The
    specifiable property is determinism and auditability, NOT enforcement —
    every sink receives every byte and can lie about its own state, and this
    text says so. The real claim is narrow and worth having: the source learns
    nothing, which is the dual of source-side targeting.
  * Authority and pre-emption (§3): pre-emption is the highest-authority
    instruction a media object can carry — it displaces what a person chose to
    watch — and today an object either lacks the field or has one anyone may
    set. Requires a sink-held trust anchor provisioned out of band; a trust
    anchor delivered over the bearer it authorises is not one. A valid signature
    establishes who signed, never that they were entitled to.
  * Detached receipts (§4): the deliverable is an honest profile, not a proof.
    Such receipts attest WHAT WAS TRANSMITTED, not what was received or
    rendered, and MUST declare the bearer unidirectional. No receipt can prove
    rendering over a bearer with no return path; what this prevents is the
    quieter error of a receipt saying "delivered" because a transmitter
    transmitted, on a link that cannot tell it whether anyone was listening.

Generalised from deployed national early-warning systems, which are where a sink
evaluating a condition the source never learns has had to work at scale.

Ingest queue items 10 and 11 (#80 §4.2, §4.3).

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-10 10:24:58 -04:00

4.3 KiB

WAI Extension: Capability Constraints

Status: Draft. Makes capability dispatch (WAI SPEC.md §4) a precondition check rather than a binary claim, by ingesting the constraint-set grammar and register pattern the broadcast-IP world already ratified. No transport, no registry service, no negotiation protocol — it evaluates values WAI already carries. Keywords MUST, MUST NOT, SHOULD, MAY are RFC 2119/8174.

1. The problem: support is not binary

WAI dispatch treats a capability as present or absent: a sink either claims cap or does not. Real sinks are not like that. A decoder supports a codec to a level — up to a resolution, a frame rate, a bit depth, a profile. "This capability, but only to 4K60 10-bit, this profile" is the normal case and is currently unexpressible.

The consequence is that partial support fails at decode time rather than at selection time. A sink advertises the capability, receives an object it cannot actually handle, and fails after committing to the bytes. Worse, WAI's rendition selection has nothing to evaluate, so it defers to a deployer policy the specification never states.

2. Constraint sets

A constraint set is an ORed set of constraints over named parameters, each constraint being an enumeration, a minimum, a maximum, or a combination. A sink satisfies a capability when it advertises cap and the object's declared parameters satisfy at least one of the registered constraint sets for cap.

This grammar is deliberately not invented here. It is the shape AMWA's Receiver and Sender Capabilities specifications (BCP-004-01 and BCP-004-02, both v1.0.0) use, with parameters drawn from a public register rather than a bespoke schema per implementation. WAI ingests the grammar and the register pattern, not the transport or the discovery model those specifications sit in.

  • A capability registration MAY publish one or more constraint sets. A capability with none is unconstrained, which is the current behaviour and remains valid.
  • A sink MUST evaluate constraint sets before dispatch, not during it. The point is to move the failure earlier; a check performed at decode has bought nothing.
  • A sink MUST NOT advertise a capability whose constraint sets it cannot evaluate. Advertising a capability while ignoring its constraints is the binary behaviour this extension exists to replace.
  • Where an object's declared parameters satisfy no set, the sink MUST treat the capability as unsupported for that object — not as a decode error, and not as a reason to attempt it anyway.

3. Parameters and the register

Parameters are named in a register, so two implementations constrain the same property under the same name. WAI adopts the pattern; it does not adopt the existing register wholesale, for a reason worth stating plainly:

The ratified registers are broadcast-essence-shaped. They cover media type, frame rate, colour sampling, bit depth, codec profile — which serves WAI's conventional media capabilities and nothing else. There are no entries for the neural, quantum, world or haptic families. Those register entries WAI must author itself, and until it does, those capabilities remain unconstrained under §2, which is the honest state rather than a pretended one.

  • A parameter name MUST resolve in a register. An implementation-local name is not a constraint anyone else can evaluate.
  • WAI-authored parameters MUST be namespaced so they cannot collide with entries authored elsewhere.

4. What this is not

  • It is not a negotiation protocol. There is no pre-flight exchange, no controller, and no registry service. Capability-plus-budget binding before execution is already owned by JCP, and duplicating it here would put two mechanisms in the tree for one job.
  • It is not a transport concern. Constraint evaluation reads values the object already declares.
  • It is not an energy mechanism. A constraint says what a sink can decode, never what it should spend.

5. Framing

The grammar is thin — close to a JSON-Schema subset — and that is fine. The value is not expressiveness; it is that a ratified, register-backed way of saying "supported, to here" already exists, and WAI's dispatch is strictly worse for having only "supported".