dispatch: capability constraints, and delivery over bearers that cannot answer #87
2 changed files with 176 additions and 0 deletions
84
wai/extensions/capability-constraints.md
Normal file
84
wai/extensions/capability-constraints.md
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
# 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".
|
||||
92
wai/extensions/unidirectional-delivery.md
Normal file
92
wai/extensions/unidirectional-delivery.md
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
# WAI Extension: Unidirectional Delivery
|
||||
|
||||
> Status: Draft. Covers bearers with **no return path** — terrestrial broadcast,
|
||||
> satellite, and multicast object carriage — where the sink receives and can
|
||||
> never answer. Generalised from deployed national early-warning systems, which
|
||||
> are the only place these seams are currently exercised at scale.
|
||||
> WAI defines no bearer here and none of this requires one.
|
||||
> Keywords **MUST**, **MUST NOT**, **SHOULD**, **MAY** are RFC 2119/8174.
|
||||
|
||||
## 1. What breaks without a return path
|
||||
|
||||
Three assumptions in the tree quietly presume the sink can talk back:
|
||||
|
||||
- [`jwp-receipts`](jwp-receipts.md) assumes relay-chain linkage throughout, and
|
||||
a chain implies hops that report.
|
||||
- Targeting presumes the source can learn something about the sink.
|
||||
- Pre-emption — an object that must displace what is playing — has no signer
|
||||
class, because nothing in WAI has needed to assert authority over a sink
|
||||
before.
|
||||
|
||||
None of these is repaired by defining a bearer. Each is a seam that can be
|
||||
specified transport-independently, and each is specified below at the strength it
|
||||
actually holds — which in one case is considerably weaker than it looks.
|
||||
|
||||
## 2. Sink-evaluated predicates
|
||||
|
||||
A **predicate capability** carries, in the object, a condition the **sink**
|
||||
evaluates against locally-held state the source never learns. The canonical
|
||||
deployed instance is geographic: an object is relevant to a region, the receiver
|
||||
holds its own location, and the source is told nothing.
|
||||
|
||||
The determinism contract is *predicate-equivalence*, in the shape
|
||||
[`state-feeds`](state-feeds.md) §3 uses: two conforming sinks holding the same
|
||||
local state **MUST** reach the same verdict on the same predicate.
|
||||
|
||||
- A predicate **MUST** be a total function of the object and the sink's declared
|
||||
state class. A predicate that can consult anything else is not evaluable
|
||||
twice.
|
||||
- A predicate **MUST NOT** be able to cause a request. The moment evaluation
|
||||
emits a signal, the privacy property is gone and this is ordinary targeting.
|
||||
|
||||
**The specifiable property is determinism and auditability, not enforcement.**
|
||||
Every sink on the bearer receives every byte, and a sink can lie about its own
|
||||
state. Nothing here prevents that and nothing here should claim to. The real
|
||||
claim is narrow and worth having: **the source learns nothing** — which is the
|
||||
dual of source-side targeting, where the source learns everything and the sink is
|
||||
told nothing.
|
||||
|
||||
## 3. Authority and pre-emption
|
||||
|
||||
Pre-emption is the highest-authority instruction a media object can carry: it
|
||||
displaces what a person chose to watch. WAI has no signer class for it, so today
|
||||
an object either has no such field or has one anyone may set.
|
||||
|
||||
- An object asserting pre-emption **MUST** carry a priority field **and** be
|
||||
signed by a key the sink holds in a **trust anchor** for that assertion.
|
||||
- The trust anchor **MUST** be sink-held and provisioned out of band. A trust
|
||||
anchor delivered over the bearer it authorises is not a trust anchor.
|
||||
- A sink **MUST NOT** act on pre-emption from an unanchored key, and **MUST NOT**
|
||||
treat a valid signature alone as authority — signature validity establishes who
|
||||
signed, never that they were entitled to.
|
||||
- Authority **MUST NOT** be inferred from position in the delivery chain. The
|
||||
entity that transmits is not thereby entitled to interrupt.
|
||||
|
||||
## 4. Detached receipts
|
||||
|
||||
A unidirectional bearer cannot carry a receipt back, so `jwp-receipts`'
|
||||
relay-chain model does not apply. The deliverable is an honest profile, not a
|
||||
proof:
|
||||
|
||||
- A publisher **MAY** emit receipts for objects sent over a unidirectional
|
||||
bearer, and those receipts attest **what was transmitted**, not what was
|
||||
received and not what was rendered.
|
||||
- Such a receipt **MUST** declare the bearer as unidirectional, so a relying
|
||||
party cannot mistake transmission for delivery.
|
||||
- A sink **MAY** retain object commitments and reconcile them out of band later.
|
||||
A reconciliation **MUST** be reported as a `claim` of class
|
||||
`binding-recovery`-style provenance, never folded into the publisher's chain
|
||||
as though it had been a hop.
|
||||
|
||||
**No receipt can prove rendering over a bearer with no return path.** This
|
||||
section does not attempt it. What it prevents is the quieter error: a receipt
|
||||
that says "delivered" because the transmitter transmitted, on a link that cannot
|
||||
tell it whether anyone was listening.
|
||||
|
||||
## 5. Framing
|
||||
|
||||
These seams are exercised today in national early-warning deployments, which is
|
||||
where a sink evaluating a condition the source never learns has had to be made to
|
||||
work at scale. The mechanisms are worth having for that reason and not only that
|
||||
one: a container that can only describe two-way delivery cannot describe
|
||||
broadcast, and broadcast is not a legacy case.
|
||||
Loading…
Reference in a new issue