---
name: cross-machine-test-rig
description: Second machine + access for spt-core cross-machine/network spikes (iroh NAT tests)
metadata: 
  node_type: memory
  type: reference
  originSessionId: 2c168d6d-6896-403a-bb2e-44bdc5b44daf
---

For two-host network tests (iroh NAT traversal, cross-node messaging), there's a second machine **enlyzeam** on the same Tailscale tailnet as the dev box **hfenduleam**. Both Windows.

- SSH access from hfenduleam: `ssh decid@enlyzeam` — key-based (my ed25519 key is in enlyzeam's `administrators_authorized_keys`), no password. SSH/MagicDNS routes over Tailscale, so it needs Tailscale **up** on both.
- Transfer: `scp <file> decid@enlyzeam:` lands in `C:\Users\decid\`.
- The Spike #2 binary `iroh-smoke.exe` is left at `C:\Users\decid\iroh-smoke.exe` on enlyzeam.

**Key gotcha for NAT-traversal tests:** the two boxes are on different home networks, but with Tailscale up iroh picks the `100.x` overlay addr as a "direct" path (Tailscale does the traversal, not iroh). To test iroh's OWN hole-punch, take Tailscale **down on the client (hfenduleam)** — then iroh hole-punches to the peer's public IP. Confirmed working (relay→direct upgrade, ~13ms direct). See [[spike-02-iroh-result]] in docs/spikes/SPIKE-02-iroh-smoke.md. Taking Tailscale down also kills ssh, so have the other side run the server + paste the ticket.

**Linux host (for `forkpty` / any Linux build or test):** **gravity-linux** on the same tailnet (Ubuntu 22.04, x86_64, 4 cores). enlyzeam is Windows — NOT a Linux option. Access is **password** auth: `ssh david@gravity-linux`, user `david` / pw `bigscreen` (NOT key, NOT my `decid` user; the tailnet is `brandon@`-owned). Windows OpenSSH has no `-pw` flag — feed the password non-interactively with an askpass shim: write a `.cmd` containing `@echo bigscreen`, then set `$env:SSH_ASKPASS=<that.cmd>`, `$env:SSH_ASKPASS_REQUIRE='force'`, `$env:DISPLAY='localhost:0'` before `ssh`/`scp`. rustup (cargo 1.96.0, minimal profile) was installed under `~/.cargo` on 2026-06-01 — `source ~/.cargo/env` first. Spike #4 (Linux forkpty parity) was run here: scp the spike crate to `~/spt-spike4/`, `cargo build && ./target/debug/spike run`. See docs/spikes/SPIKE-04-forkpty-parity.md.

**Working recipe from the Claude Bash tool (git-bash on Windows, used for M3a cross-OS validation 2026-06-02):** the askpass shim works as a plain `/tmp/askpass.sh` containing `echo bigscreen` (chmod +x) with `SSH_ASKPASS=/tmp/askpass.sh SSH_ASKPASS_REQUIRE=force ssh -o StrictHostKeyChecking=no david@gravity-linux '<cmd>' < /dev/null`. **No `rsync` on either side** — sync the workspace by piping a tarball: `tar czf /tmp/x.tgz --exclude=target --exclude=.git . ; ssh … 'cat > /tmp/x.tgz' < /tmp/x.tgz` then `ssh … 'rm -rf ~/spt-core-sync && mkdir ~/spt-core-sync && tar xzf /tmp/x.tgz -C ~/spt-core-sync'`. cargo/rustc are NOT on the default non-interactive PATH — prefix every remote cargo cmd with `export PATH=$HOME/.cargo/bin:$PATH`. **clippy is NOT installed** on gravity-linux (only Windows + CI lint). Gotcha: `cargo test --workspace` (parallel) flakes `spt-msg::two_agents_exchange_message_tcp_and_spool` on a fixed-port/resource race — passes in isolation and under `--test-threads=1`; a pre-existing M1 test-isolation issue, not a real bug.
