Six Doors, 231 Lines, and No Dashboard: Putting a Three-Machine Fleet on One Screen
Key Takeaways — Executive & AI Summary
- The three machines became a fleet in one day of ssh work: 6 directed doors where machine A runs headless Claude on machine B — stateless phone calls, credentials never crossing the wire — all 6 wrapper files still on disk today, 4 of them stat'd at 334 to 912 bytes.
- A same-day stress test priced the mesh: 0 packet loss and 140/89 ms links, but a Claude round trip of 24 s to the 512 MB box vs 8–12 s to the workstation — the 2.4× gap is RAM, not wire, so the fleet's one physical law routes heavy reasoning away from the small machine.
- The cockpit is a 231-line probe checking 12 keys every 5 minutes and logging the whole fleet in 3 lines per round; 16 days of alerts hold 20 red, 8 yellow, 25 green, exactly 1 real link outage — and its longest streak, 4,711 checks, is arithmetic that lands within 5 minutes of the probe's own v2 reset.
Episode 5 of One Man One Legion. Episode 4 fixed where the human appears. This one closes the Cockpit arc: where the fleet appears to the human — 3 machines on 3 networks becoming one screen, no dashboard ever built.
Three machines, three networks: a 512 MB VPS on the US West coast running the thin control plane, a dual-GPU workstation behind home NAT, a 4 GB always-on node in Seoul. Between August 10 and 13 they became a fleet commanded from one chair. The whole machinery: 6 ssh doors, a 58-line org chart, a 231-line probe, a 4-line heartbeat. Not one dashboard.
Six doors in one day
Claude Code instances have no native chat protocol, and the fleet never built one. The answer, fixed August 10: machine A ssh-es into machine B and runs headless claude -p — B’s agent wakes with its own instructions and memory, answers in one shot, hangs up. Stateless as a phone call; context rides in the prompt.
The day’s choreography is still readable in file timestamps: 08:33, the small box’s wrapper for calling the workstation; 09:12, its public key authorized on the Seoul node over Tailscale (public ssh had been closed August 9); 09:16, its wrapper for calling Seoul; 15:45, the workstation’s two wrappers back. Six directed doors for 3 machines — all 6 wrapper files verified on disk today, 4 stat at 334 to 912 bytes. This episode’s writing rode one of them: every workstation file quoted here crossed that rail.
Two scars are welded into those tiny scripts. First: non-interactive ssh never sources .bashrc, so the callee’s cloud-model credentials don’t load and headless Claude answers Not logged in — the fix evals the export lines on the far side, so the key never crosses the wire. Second: the 512 MB box can’t afford the call. Its own agent measured the bind: interactive Claude sits at 157 MB resident, leaving 77 MB available — less than the 99 MB a headless call wants. So the wrappers split in two: a 334-byte pure file-read for roughly 90% of traffic, zero memory; the true headless call for the rest, one at a time.
The map and the law
On August 11 the fleet wrote its own org chart — 58 lines, v3, drafted by the small box’s agent over the very channel it describes, after negotiating with the workstation’s. Its one physical law is memory asymmetry: heavy reasoning routes away from the small machine — brainwork places a call, and the Claude runs on 503 GB or 4 GB instead. The stress test that morning priced the law: 0 packet loss on both links, 140 ms and 89 ms direct — yet a Claude round trip of 24 s to the small box against 8–12 s to the workstation, about 2.4×. The wire was innocent; RAM was the toll. The test stayed gentle: no flooding, strictly single shots at the weakest node.
The screen
The cockpit itself landed the same day, inside 7 hours. 02:37, the first outbound self-check. 06:32, the stress test. 07:06, the probe: 231 lines of bash on the Seoul node, cron every 5 minutes, first run 9.9 s. It asks 12 keys — small-box memory, load, disk, gateway, Tailscale path; Seoul’s vitals; 3 external APIs; the orchestrator — and writes the fleet in 3 lines per round. That log file is, literally, the fleet on one screen. 07:10, a 4-line heartbeat on the workstation started pinging both peers every 2 minutes — the probe’s first run had caught its path riding a San Francisco relay at 936 ms, and once the heartbeat held the tunnel, it read direct at 90 ms. Today’s tail still shows that path direct, 176–181 ms. 07:19, alerts wired to Telegram. 07:38, the operator fixed 3 rules: the workstation leaves monitoring (a sleeping power machine is not news), the small box gets a memory threshold, and relayed paths count as faults. 09:42, the v2 rewrite: 4 severity states, run time down to 3.7 s.
The rewrite also caught a geography bug: the small box’s Gemini probes returned 400, location not supported — geo-blocked where the wire lands; from Seoul the same API answered 403, reachable but keyless. Gemini monitoring moved to Seoul, its key piped over ssh into a 600-permission file — never displayed, never in a prompt.
Sixteen days of quiet, priced
The alert log now spans 16 days: 20 red, 8 yellow, 25 green — and exactly 1 real link outage, 10 minutes of Tailscale darkness on August 12. The state file’s streak counters remember more than the log shouts: the path key’s 4,526-check streak begins on the precise minute of that recovery; 6 keys hold 4,711 unbroken checks — 16.4 days, arithmetic landing within 5 minutes of the v2 reset itself. Load spiked red 10 times, 2.01 to 2.88, every one gone by the next check. Memory brushed its warn line 5 times at 78–98 MB and recovered to 140–162 MB — a threshold sized exactly for this. And the channel that reports failures watches its own mouth: the bot self-check failed 7 times in 16 days, each healed within 10 minutes, once at 01:15 this very morning.
The mesh’s first fleet-wide act came August 13: one working principle, written into all 3 machines in a single evening — 55 lines appended to the small box’s charter over ssh, because its 132 MB free couldn’t afford a Claude; 133 lines to the workstation’s, where headless Claude is permission-blocked from that file, so ssh again. Plumbing this reliable stops being plumbing. It is a nervous system.
No dashboard was ever built. The unified view is a 12-key JSON, an alert thread, and 3 lines every 5 minutes; the roadmap’s web dashboard sits in Tier 3, future tense — the fleet’s own broadcast doctrine says prove the problem before the platform.
Back to the fleet audit — the Cockpit arc closes here; next, what the legion remembers between sessions.
FAQ — Direct Answers
- Why no real dashboard — Grafana, web UI, anything?
- Because nothing in the problem demanded one. The operator's actual questions — is the little box breathing, is the link direct, did anything break overnight — are answered by 3 log lines per 5 minutes and a push alert on red. The fleet's own doctrine, broadcast to all 3 machines on August 13, is form-follows-problem: prove the need before the platform. A unified web dashboard still sits on the roadmap's Tier 3, future tense, on purpose.
- What if the probe itself dies?
- Then the probe dies with the node it lives on — that is the known gap, monitored negatively: the Seoul node is the only prober, so its total silence is itself the alarm a human would notice. What the design does cover is the alert channel failing while the probe lives: every 5-minute round calls getMe on the Telegram bot before trusting it, which is why the logs show 7 self-check failures in 16 days, each healed within 10 minutes.
- Do the machines really talk to each other without the human?
- Yes — the framework document that defines the fleet was itself written by the 512 MB machine's agent over this channel, negotiating with the workstation's agent, and the August 13 principle was written into all 3 machines in one evening. The writing of this episode rode the same rail: every workstation file quoted here was read through one of the six doors, live, during the session that produced it.