A Client That Cannot Hear
Remote Play is not only video and buttons. The protocol can carry the remote user's microphone to the console, so a player can talk into a party chat from their phone. For Oriel's hands that feature is a liability: a process on Pippa's Mac, in a family home, that could open a microphone and send what it hears to a game console. So the hands are built to be unable to hear, at three levels:
- Runtime: every session starts with audio disabled, and the client's microphone path is never connected.
- Device:
oriel-handsopens no device at all. It talks to the console over the network and decodes video; it has nothing to open. - Build: the binary links no audio framework. The build script lists what the binary links and fails if CoreAudio, AudioToolbox or AVFAudio appears. Code added later that linked an audio framework would fail the build. What a link check cannot see is a library loaded by name at run time, so that door is closed by review rather than by the script: the guarantee is about what the build produces.
The third level is the one worth copying. Runtime flags can be flipped and code paths can be added; a build that refuses to produce a binary linking the capability is the strongest guarantee a script can give, short of deleting the feature from the library. Loading by name at run time is the one door it leaves to review.
Preflight: Every Reason Not to Touch the Console
Before the hands touch the console for any command, a preflight function returns every reason not to, and an empty list means go. Each reason is a sentence the caller can act on:
- An Oriel watch session is running. Hands wait until it stops, so Pippa never moves the game while Dad's play is being recorded and coached.
- On Air is not confirmed off. Hands never touch the console during Dad's broadcast. "Not confirmed off" includes "could not read it" (the next lesson is about that read). The one exception is a play session Dad approved, because then the broadcast is Pippa playing.
- The console is asleep. Hands never wake it. A console in standby belongs to whoever left it there.
- A title is running that nobody named. Someone may be playing it. Naming the title explicitly is the way to say "yes, that one".
The console also allows only one Remote Play session at a time. While another client holds it, a hands connection fails with "already in use", and the rule from the previous lesson applies: the other client is closed by a person, never fought.
Harmless Buttons by Default
A one-off command (navigating a menu, measuring latency) may press only the D-pad and Circle unless it is explicitly marked allow_any. Every other button can confirm or change something, and the refusal says exactly that, listing the harmless ones. Inside a play session, where Pippa really plays, every button is available except two, PS and Create: the home button (which leaves the game for the console's system menus) and the capture/share button. They are denied twice, once in the action's schema and once in the client's own session spec, so a mistake in one layer is caught by the other.
Above the mechanical guards sits Dad's rule, which no flag lifts: never a purchase, never a delete, never a console setting change, never a save written over his slots. Pippa carries that rule into every menu; the denied buttons are its mechanical backstop, not its whole content.