OpenRig

Other machines, and people

Documented against OpenRig 0.7.7. Help text uses "node" where these pages say seat, for a seat's position in the running rig.

What it is for

The world does not end at this machine. Other instances run on other machines and are reached through a declared registry, not a guessed hostname. rig host manages that registry, rig file copy moves one file between hosts without hand-rolling the address, and many verbs take --host <id> to act on a registered machine. People are addressed the same way as seats: rig gateway human registers a person and their connector, and a queue row created with that person's external address is the durable way to ask them for a decision. rig slack is one connector implementation.

The three commands you will use first

Register a machine and check it works end to end. rig host pair <url> registers a host from one pasted address with one approval on the target; rig host add is the manual path. rig host doctor takes the registered host id.

rig host add --id vps-b --transport ssh --target vps-b.example.net --user ops
rig host list
rig host doctor vps-b

Act on it. The same verbs, with --host. rig file copy uses an ssh entry; reading a transcript (rig transcript --host) needs an http entry.

rig capture --host vps-b dev-impl@my-rig --lines 50
rig send --host vps-b dev-impl@my-rig "the brief is in your home folder" --verify
rig file copy ./brief.md vps-b:/home/ops/brief.md --dry-run

A queue write to another host (rig queue create --host) waits 15 seconds for that daemon's answer. If none comes, the result is INDETERMINATE, not failed: the row may exist there. The CLI reads it back once by its ID; if it's still unknown, check that host for the row before creating it again, and reuse the same --id if you must retry.

Reach a person durably. Register the human, check readiness, then create a row to their external address; the row's transitions are the receipt.

rig gateway human add sam --display-name "Sam, product owner" \
  --binding "slack:openrig-personal:file:/etc/openrig/slack.env:primary:handle=U12345678" \
  --delivery-class B
rig gateway human list
rig queue create --destination sam@external --body-file decision.md --verify

A person can set quiet hours (rig gateway human quiet set sam --daily 22:00-07:00, or --until 07:00): routine asks are held rather than posted, asks tagged escalation still reach them, and the held ones post one by one when quiet ends. rig gateway participants lists everyone you can address: people, shared channels (one vetted Slack channel is one participant, <id>@external, however many people post in it), and the organizations and groups they belong to, whose policy your agents can read. rig gateway default shows or chooses the person that escalations go to when no one is named. In the terminal UI, the Feed's whose command chooses whose asks you see: one person's, everyone's, or the default person's.

Slack as a connector

The connector talks to a Slack app you create in your own workspace; rig slack manifest prints that app's manifest offline, and --url prints Slack's create-app link with it prefilled. The full walkthrough is Slack app setup. rig slack setup records the channel, the inbound destination seat and the notification levels; secrets stay in a 0600 env file, never in config. status shows the local configuration and bounded daemon socket and recovery observations without calling Slack; verify live-checks granted scopes and channel membership; enable and disable switch the daemon's delivery path. Notification levels are RECORD, NOTICE and ALERT, and the posting and interrupting thresholds are set separately.

rig slack setup --channel C0123 --inbound-destination direction-lead@my-rig --secrets-env-file ~/.openrig/slack.env
rig slack status
rig slack verify
rig slack enable

The host, file, gateway and slack families

Command What it does (from help) Help source
rig file Cross-host file movement over ssh/rsync (v0: one explicit verb , copy) file.txt
rig file copy Copy one file. <hostId>:<absolute-path> = remote (ssh registry entry); bare path = local; local files with a colon need the ./ prefix. Valid shapes: local→remote, remote→local, local→local. An existing destination is OVERWRITTEN , preview with --dry-run. file.copy.txt
rig gateway Gateway: the human registry + connector surfaces gateway.txt
rig gateway channel Shared-channel participants: one vetted Slack channel is one participant (<id>@external), not a person per sender gateway.channel.txt
rig gateway channel add Register a shared channel gateway.channel.add.txt
rig gateway channel remove Remove a shared channel: refuses while non-terminal rows are addressed to it (--force removes anyway) gateway.channel.remove.txt
rig gateway default Show or choose the default person: the one escalations, the notice digest, Mission Control's my-queue and pairing go to when no person is named gateway.default.txt
rig gateway group Groups inside an organization, with readable policy agents apply gateway.group.txt
rig gateway group set Create or update a group gateway.group.set.txt
rig gateway human Manage human specs (file-per-human fragments under gateway/humans/) gateway.human.txt
rig gateway human add Add a human fragment (verb-add-only; the fragment is truth, the registry is a GENERATED projection) gateway.human.add.txt
rig gateway human list List the registered people, with delivery readiness and quiet hours (rig gateway participants adds organizations, groups, policy and shared channels) gateway.human.list.txt
rig gateway human mode A person's modes: save one as they agreed it, apply it, see what's on, end it ("I'm back") gateway.human.mode.txt
rig gateway human mode account The facts for a person's "back" account of one ended mode: how it ended, each effect, decisions made for them, what's waiting, and what isn't tracked. Made from the records only gateway.human.mode.account.txt
rig gateway human mode apply Switch a person into a saved mode, and show each effect's real state. 'at-desk' ends the current mode and applies none gateway.human.mode.apply.txt
rig gateway human mode current Show the mode that's on for a person, with each effect's real state (none: at desk), and any restoration still owed gateway.human.mode.current.txt
rig gateway human mode decide Record a decision you made on the person's behalf, inside their mode's decision room, on your own pending ask. It's recorded as delegated, never as their answer, and the ask closes gateway.human.mode.decide.txt
rig gateway human mode decisions The decisions made on a person's behalf under one mode application gateway.human.mode.decisions.txt
rig gateway human mode end "I'm back": end the person's mode. Each effect ends only if it's still the mode's own; a later choice of theirs stays. Restorations still owed are tried again gateway.human.mode.end.txt
rig gateway human mode room Before asking a person a decision: the decision room of the mode they have on, in their own words, or none. You judge whether your decision falls inside it gateway.human.mode.room.txt
rig gateway human mode save Save one of a person's modes as they agreed it. Saving again replaces it gateway.human.mode.save.txt
rig gateway human mode saved Show a person's saved modes (or one), and the one that's on now gateway.human.mode.saved.txt
rig gateway human quiet Quiet hours: while on, routine asks to this person are held, not posted; urgent ones (tagged escalation) still reach them. Held asks post once, each on its own, when quiet ends gateway.human.quiet.txt
rig gateway human quiet clear Remove the quiet-hours rule altogether gateway.human.quiet.clear.txt
rig gateway human quiet end "I'm back": end the quiet that is on now. A daily rule stays for tomorrow gateway.human.quiet.end.txt
rig gateway human quiet set Set quiet hours: every day in a timezone (--daily 22:00-07:00), or from now until a time (--until 07:00 or an ISO time) gateway.human.quiet.set.txt
rig gateway human quiet show Show the quiet-hours rule, whether it's on now, and the next boundary gateway.human.quiet.show.txt
rig gateway human remove Remove a human: refuses while open conversations or non-terminal rows exist (--force archives and records what was orphaned; the fragment is archived, never deleted) gateway.human.remove.txt
rig gateway human set Edit one field through the verb (same validation as add; re-projection immediate). Fields: display-name, delivery-class, away, availability (available/focus/away/off, or unset), slack-subscription (the person's Slack subscription: every-ask, the default, posts every ask to Slack too; urgent-only posts only asks created with --alert, the rest wait on Steering and the TUI; or unset), binding.<n>; and, kept in the participant side file: organization (an id, or unset), groups (comma-separated ids, or unset), policy (text, @<path> to read a file, or unset) gateway.human.set.txt
rig gateway human show Show the effective record: fragment values + which defaults filled the rest, with provenance gateway.human.show.txt
rig gateway org Organizations: the outer layer of participants, with readable policy agents apply gateway.org.txt
rig gateway org set Create or update an organization gateway.org.set.txt
rig gateway participants List people and shared channels, with organization, groups, policy and the default gateway.participants.txt
rig host Manage the multi-host registry (~/.openrig/hosts.yaml) host.txt
rig host add Add a host entry (validated with the registry loader's own rules) host.add.txt
rig host doctor Stepwise host verification (+ --posture for the product-factory-vps baseline) host.doctor.txt
rig host list List registered hosts w/ status + selected marker (config pointers only , never secret values) host.list.txt
rig host pair Pair with a remote host from one pasted address , one approval on the target, done (FR-6) host.pair.txt
rig host rename Rename THIS host's display name (renders in dashboard, explorer, ls, whoami) host.rename.txt
rig host select Select which host you are viewing/acting on (persisted; 'local' returns to this host) host.select.txt
rig slack Slack connector: configuration + in-daemon subsystem admin (S10) slack.txt
rig slack channel-map Post a rig's or seat's human-bound items to its own channel (list / set / remove) slack.channel-map.txt
rig slack channel-map list Show the default channel and every mapped rig or seat with its channel slack.channel-map.list.txt
rig slack channel-map remove Remove a rig's or seat's entry; it falls back to its rig's entry or the default channel slack.channel-map.remove.txt
rig slack channel-map set Map a rig (my-rig) or seat (lead@my-rig) to a Slack channel id; replaces an existing entry slack.channel-map.set.txt
rig slack disable Disable the connector (the daemon rewires to an inert delivery path) slack.disable.txt
rig slack enable Enable the connector (daemon seeds the current backlog as history , no replay storm , then rewires) slack.enable.txt
rig slack inbound [RETIRED , S10] the in-daemon subsystem owns Socket Mode inbound slack.inbound.txt
rig slack outbound [RETIRED , S10] the in-daemon subsystem owns outbound delivery slack.outbound.txt
rig slack setup Configure the connector (first-class config; secrets stay in the env file, never here) slack.setup.txt
rig slack manifest Print the Slack app manifest for creating your own OpenRig Slack app (offline) slack.manifest.txt
rig slack post-open-asks Show in Slack the asks still open that enable marked as seen, through ordinary delivery, and say what became of each slack.post-open-asks.txt
rig slack status Show local configuration and bounded daemon socket/recovery observations (no Slack calls) slack.status.txt
rig slack verify Live-verify GRANTED Slack scopes (from response headers) + channel membership slack.verify.txt

What it does not do

  • Across a host boundary, "it didn't work" has four shapes: unreachable machine, permission gate, remote runtime down, or the remote command itself failed. A successful transport says nothing about the operation.
  • Transports differ by verb: send and capture work over an ssh or http entry, rig file copy needs ssh, and rig transcript --host needs http. rig host list shows each entry's transport.
  • Registering a human or configuring a connector does not send anything. A posted receipt proves posting, not that anyone read it.
  • rig file copy overwrites an existing destination; preview with --dry-run.

Where it goes next

  • Messaging: the seat-to-seat channel that --host extends.
  • Coordination: the queue row that carries a human request and its receipt.