Either player types /start satisfactory from a phone; a moment later the bot posts again to say it's actually up, and they join. /stop satisfactory saves the world and shuts it down. And when someone runs to the store mid-episode, /pause holds the show and /play picks it back up — one tap, no argument. When somebody talks over a line, /back jumps back thirty seconds — or /back 90 if it needs longer — and /forward goes the other way. When the episode ends, /next moves on to whatever was queued up, and /previous goes back one. /next 3 skips three at once, and a negative goes the other way. The replies say what's playing and how far in — Reveille reads that from the player as it acts, tells you, and forgets it. It never remembers what was on, and it never picks what plays: that stays yours. Nobody has to get up. /status says what's happening across every target — and /help lists exactly the commands that work in this server, so nobody has to be told. That list is generated from the commands themselves, not written down beside them, so it cannot drift out of date.
Ask "what is it welded to?" and every placement question answers itself. The orchestrator is the only component that ever relocates; actuators multiply instead. They talk over a network API — always, even while sharing a box.
Decides when. Takes the named Discord command, routes it to the right server, and serializes it to one clean winner.
Knows how. One adapter per target behind a fixed interface — a game or a media player, each with its own verbs; only the adapter knows which target it is. Owns the save-before-exit guarantee.
Wakes sleeping machines. Deferred today, but the seat is already drawn so it needs no rewrite later.
More rows, never new components. Satisfactory joined Palworld as a pure row — one more adapter, one more address, no new kind of thing. VLC went one notch further: pausing playback isn't a server lifecycle, so it earned its own adapter kind and its own verbs — but it is still one agent at one more address, reusing the whole seam. No new component was needed. Skipping and rewinding were narrower still — four more commands on that same kind, at that same address: a column, not a row, and not a new kind of anything. And a private guild is a row too: each Discord server the bot serves is a tenant, scoped to its own targets and isolated from every other — one bot, many groups, none able to see or touch another's. If a capability ever needs a fourth kind of component rather than another row, something was drawn wrong.
A simulation running entirely in your browser — nothing is connected to a real host. Switch targets, and each holds its own state: the games take /start·/stop, VLC takes /pause·/play. The demo covers those; the live bot also takes /next, /previous, /forward and /back on the media target. The refusals below are the real spec (FR-008, FR-017, FR-021, SC-002).