docs(openspec): archive gateway input feedback contract
This commit is contained in:
+79
@@ -0,0 +1,79 @@
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Typed sequenced input envelope
|
||||
The `input.sequenced.v1` payload SHALL begin with ASCII `VGI1`, a one-byte
|
||||
event kind, and one-byte payload length. It SHALL contain exactly one bounded
|
||||
keyboard, mouse-button, relative-mouse, UTF-8 scalar, or controller-state
|
||||
event. False keyboard/mouse state and zeroed controller state are explicit
|
||||
releases. Multibyte integer fields SHALL be big-endian. Unknown kinds,
|
||||
length mismatches, malformed UTF-8, unsupported controller indices, and
|
||||
reserved fields SHALL be rejected before provider translation.
|
||||
|
||||
#### Scenario: Keyboard state change
|
||||
- **WHEN** a client sends a valid keyboard press or release envelope
|
||||
- **THEN** the gateway forwards the corresponding typed provider input on its
|
||||
reliable keyboard channel and records the pressed state for cleanup.
|
||||
|
||||
#### Scenario: Invalid input envelope
|
||||
- **WHEN** a client sends an envelope with an unknown event kind, invalid
|
||||
length, malformed UTF-8 scalar, or nonzero reserved field
|
||||
- **THEN** the gateway rejects it without sending provider input or changing
|
||||
pressed state.
|
||||
|
||||
### Requirement: Explicit input release
|
||||
The typed input envelope SHALL represent release of each keyboard key,
|
||||
mouse button, and controller state. Gateway cleanup SHALL send a typed release
|
||||
for every accepted pressed state before provider disconnect; it SHALL NOT use
|
||||
an implementation-specific release-all provider command.
|
||||
|
||||
#### Scenario: Tunnel cleanup with pressed input
|
||||
- **WHEN** a tunnel closes after accepted pressed keyboard, mouse, or
|
||||
controller input
|
||||
- **THEN** the gateway emits the corresponding individual provider release
|
||||
packets reliably before starting provider disconnect.
|
||||
|
||||
### Requirement: Bounded provider feedback control envelope
|
||||
The registered bidirectional reliable `control.ack.v1` flow SHALL define an ASCII `VGF1` envelope
|
||||
with a direction byte, type byte, big-endian payload length, and exact payload
|
||||
bytes. Only host termination, rumble, and HDR feedback SHALL be valid from the
|
||||
gateway to the client; only IDR and FEC/loss feedback SHALL be valid from the
|
||||
client to the gateway. The envelope SHALL contain no provider address,
|
||||
certificate, credential, or opaque provider packet.
|
||||
|
||||
#### Scenario: Host termination forwarding
|
||||
- **WHEN** the Apollo adapter receives an authenticated host termination
|
||||
packet
|
||||
- **THEN** the gateway forwards a bounded `VGF1` termination envelope over
|
||||
reliable Verse control and reports the provider state separately.
|
||||
|
||||
#### Scenario: Unauthorized or malformed feedback
|
||||
- **WHEN** feedback is disabled by policy, has an invalid direction/type/length,
|
||||
or contains a forbidden provider field
|
||||
- **THEN** the gateway rejects it without forwarding or provider mutation.
|
||||
|
||||
### Requirement: Policy-bound text clipboard envelope
|
||||
The reliable `clipboard.text.v1` flow SHALL carry only a typed UTF-8 text
|
||||
envelope with exact direction and a 16--128 character canonical unpadded ASCII
|
||||
base64url loop token. The Server SHALL mint
|
||||
the enabled directions, maximum text bytes, and maximum updates per minute in
|
||||
authenticated provider work. The gateway SHALL reject disabled direction,
|
||||
unknown fields, files, file URLs, client folders, binary data, malformed UTF-8,
|
||||
oversized values, rates above policy, and reflected/replayed loop tokens. It
|
||||
SHALL not put clipboard content, provider routes, or credentials in telemetry,
|
||||
audit, state, or errors.
|
||||
|
||||
#### Scenario: Clipboard audit metadata
|
||||
- **WHEN** the gateway successfully delivers, suppresses, or rejects a clipboard update
|
||||
- **THEN** it sends an authenticated Server audit record with only direction,
|
||||
bounded byte count, outcome, and a fixed reason; it never includes text or
|
||||
the loop token.
|
||||
|
||||
#### Scenario: Clipboard delivery failure
|
||||
- **WHEN** provider-to-client control delivery fails
|
||||
- **THEN** the gateway does not report the update as forwarded.
|
||||
|
||||
#### Scenario: Reflected clipboard value
|
||||
- **WHEN** a client-originated text value returns from the provider with the
|
||||
matching retained token/value pair
|
||||
- **THEN** the gateway suppresses the reflected update without a second
|
||||
provider mutation or client delivery.
|
||||
Reference in New Issue
Block a user