# Other machines, and people

Documented against OpenRig 0.5.14. 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 add --id vps-b --transport ssh --target vps-b.example.net --user ops
rig host list
rig host doctor
```

**Act on it.** The same verbs, with `--host`.

```
rig capture --host vps-b dev-impl@my-rig --lines 50
rig transcript --host vps-b dev-impl@my-rig --tail 100
rig file copy ./brief.md vps-b:/home/ops/brief.md --dry-run
```

**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 "Sam, product owner"
rig gateway human list
rig queue create --destination sam@external --body-file decision.md --verify
```

## Slack as a connector

`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` says whether it is configured and resolvable without touching the network; `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

[//]: # (table:start)
| 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 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` | Show the configured human (single-human surface per A1/R5; several fragments render honestly with a 0.5.7 advisory) | gateway.human.list.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, binding.<n> | 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 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 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 status` | Show the connector's configured + resolvable state (honest; no network) | slack.status.txt |
| `rig slack verify` | Live-verify GRANTED Slack scopes (from response headers) + channel membership | slack.verify.txt |

[//]: # (table:end)

## 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 host: an ssh entry carries send and capture; an http entry carries lifecycle verbs; the registry entry says which.
- 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](/docs/messaging): the seat-to-seat channel that `--host` extends.
- [Coordination](/docs/coordination): the queue row that carries a human request and its receipt.

