box-onboarding
Admit a new box to the multibox fleet: install, probe, register identity, key, verify reach.
SKILL.mdskills/box-onboarding/SKILL.md
GitHubBox Onboarding
A one-time act, run on the box being admitted. It is not a G-EM turn: there is one network-wide
G-EM, which reaches the admitted box over Unimatrix, and any box may hold it (last writer wins
across the network; coordinator/skills/group-em/references/multibox.md, "One G-EM"). A box
without a G-EM is not missing one. Onboarding gives that G-EM a box it can place work on
("Placement") and see on the federated roster ("Federated roster"). Admission of any one job stays
the target box's own verdict ("Local admission per box").
Rules: no hostname, drive letter or user path is a rule; identity comes from machine-local and
Claude-klabauter's box registry. No key body, fingerprint or vault content is ever written to a tracked file
(coordinator/docs/wiki/multibox-key-custody.md). Steps marked guarded stop with a one-line
notice when the engine half has not shipped; a stop is not a failure, record it and continue.
Each step gives one command per host family. <klabauter-clone> is the engine clone from
machine-local get repos.claude_klabauter.
Steps
Install coordinator-claude per
INSTALL.md(Steps 0-3), then clone the engine (Step 1e).- Windows (PowerShell):
claude plugin list - macOS / Linux:
claude plugin list - Done when
coordinator-claudeis listed after a restart.
- Windows (PowerShell):
Run claude-klabauter's setup. Read every
PASS/FAILline; non-zero exit means not installed.- Windows:
python <klabauter-clone>\scripts\setup.py --i-am-agent - macOS / Linux:
python3 <klabauter-clone>/scripts/setup.py --i-am-agent - Linux headless: also confirm
systemctl is-active sshd; macOS:sudo systemsetup -getremotelogin(Remote Login on); Windows:Get-Service sshd(running).
- Windows:
Capability probe (guarded). The probe is claude-klabauter's; absent, print
probe not yet shippedand stop this step.- Windows:
python <klabauter-clone>\scripts\setup.py --help | Select-String capability(no match: printprobe not yet shipped) - macOS / Linux:
python3 <klabauter-clone>/scripts/setup.py --help(no capability option listed: printprobe not yet shipped) - The probe's record marks UE/p4 present or absent; a UE/p4-absent box never receives UE work.
- Windows:
Register box identity (guarded). Read back what
machine-localand claude-klabauter's registry know; the registry row is written by the box's owner (EM), not by this skill.- Windows:
machine-local keys | Select-String "^box";machine-local get box.id - macOS / Linux:
machine-local keys(read thebox.keys);machine-local get box.id - No
box.*keys: printregistry schema not yet shippedand stop this step.
- Windows:
Issue keys per the custody page. Keys are named
<role>: <from> → <to>. Roles:Unimatrix-01is full shell, break-glass;Unimatrix-Zerois the comms relay only;Unimatrix-02is the project-rag tunnel only (forwarding, no shell). One key per box pair, so a leak's blast radius is that pair; Zero is needed one way per pair because the initiating box holds the inbox connection. Unimatrix-01 is a full mesh: any one box can be the controller or the controlled, so long as the keys authenticate (PM: "we should be able to pick any one box as the controller or controlled, so long as the keys authenticate etc etc"). Fetch from the 1Password Team vault, install the target-sideauthorized_keysline, never copy a private half onto this box. 1Password's CLI cannot edit SSH Key items, and a CLI import of an existing OpenSSH key lands unparsed: import and rename in the app (op --ssh-generate-keyis fine).- Windows:
op item get "<role>: <from> → <to>" --vault <team-vault> --fields label=public_key - macOS / Linux:
op item get "<role>: <from> → <to>" --vault <team-vault> --fields label=public_key - Place the line: macOS / Linux
~/.ssh/authorized_keys; Windows$env:ProgramData\ssh\administrators_authorized_keysfor an admin account. - Pin recipe and its tests are project-rag's; issuance is claude-klabauter's.
- Windows:
Verify reach. From the box holding the G-EM standing, LAN first: on the home network verify over the box's LAN address with the tunnel off; try the tunnel address only when the LAN address is unreachable (
unimatrix-mechanism.md, "Transport").- SSH no-op, Windows / macOS / Linux alike:
ssh -o BatchMode=yes <box-alias> true; echo $?(PowerShell:$LASTEXITCODE). Expect0. - Tunnel pin refuses a shell:
ssh -o BatchMode=yes -i <tunnel-key> <box-alias> truemust fail. - Tunnel MCP initialize (the port is the tunnel's, carried only over the
Unimatrix-02key):ssh -N -L 8767:127.0.0.1:8767 <tunnel-alias>in one shell, thencurl -s -o /dev/null -w "%{http_code}" -X POST http://127.0.0.1:8767/mcp -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"onboard","version":"0"}}}'(Windows:curl.exe; add the bearer-token header if the daemon requires it). Expect200. - Never route compute or spawning through that port; sessions and jobs use the shell key.
- SSH no-op, Windows / macOS / Linux alike:
6a. Optional: Unimatrix cross-account messaging. Skip when the box shares the primary's
Claude account: native /rc is the first route (A-SAME-ACCOUNT-CROSS-BOX-USES-NATIVE-RC-FIRST).
Check mode first; it refuses outside the verified Claude Code range
(A-UNIMATRIX-INSTALL-REFUSES-OUTSIDE-THE-VERIFIED-CLAUDE-RANGE); --force only warns.
- Windows:
python coordinator\bin\unimatrix-install.py, then--installonce it printsin verified range - macOS / Linux:
python3 coordinator/bin/unimatrix-install.py, then--installonce it printsin verified range - Consumer box (released plugin only): run
python3 "$CLAUDE_PLUGIN_ROOT/bin/unimatrix-install.py"(Windows:python) from the installed plugin root, same check-then---installorder. - Run the install on both boxes of a pair (both directions); either box can hold the network's one G-EM.
- The relay key follows the custody page (
A-UNIMATRIX-KEY-IS-A-FORCED-COMMAND-RELAY-KEY).
- Record the result. One line per step,
PASS/FAIL/GUARDED-STOP, in the box's onboarding handoff. AGUARDED-STOPnames the engine row it waits on.
After onboarding
The box appears on the federated roster once claude-klabauter's heartbeat feed lands. Until then a remote
session is unknown, not quiet. The cross-box SendMessage test protocol lives in
references/multibox.md ("Cross-box SendMessage"); run it once step 6 passes.