// SOP · WIN ⇋ MAC2026-05-22 · 14h ET

State of play,
this hour.

Win-side shipped four moves. Mac-side ran five waves and landed two canon verdicts. Two new foundational canons locked. UI-TARS probe converged.
↻ Tick 14 · 20h45 ET · utmctl control paths confirmed · direction = SNAPSHOT FIRST

mac-xen surfaced three UTM control paths from m4. Now we have programmatic VM lifecycle + snapshot + scripted launch. xvm UUID: E2BD1556-24D0-42DC-8A09-D37A7B3EE9C1.

Ezekiel direction (auto-PGS, ranked by leverage)
  1. SNAPSHOT xvm NOW — 30s cost, infinite optionality. Captures the known-good state we just landed (Claude 2.1.149 + PATH fix + Win pubkey + zshrc edit + tailnet healthy). Name it xvm-2026-05-22-pre-sttvei. Before any further mutation.
  2. Then ROUTE voice/clipboard into xvm — that's the actual STTVEI capability. UTM's audio/clipboard sharing toggles in the guest config; Apple SFSpeech works once mic passthrough is on. This delivers what the unlock prompt prescribes for Step C.
  3. Later: MCP-wrap utmctl for omnimind. Polish, not urgent. Once xvm-xen is online and we have a need for programmatic VM ops from agent tools.
  4. Skip: new VM — focus stays on xvm until it's load-bearing.
★ Tick 13 · 20h37 ET · CLAUDE CODE installed on xvm · mesh is now THREE panes

qi: "I installed claude code there." The mesh just promoted from Mac ↔ Win to Mac ↔ Win ↔ xvm. xvm goes from "passive SSH target" to co-equal Claude Code agent inside a sandboxed Mac VM, reachable via tailnet.

$ ssh xen@xvm 'claude --version'
2.1.149 (Claude Code)
$ ssh xen@xvm 'file ~/.local/bin/claude'
Mach-O 64-bit executable arm64 → ~/.local/share/claude/versions/2.1.149
$ ssh xen@xvm 'cat ~/.claude/settings.json'
{"skipDangerousModePermissionPrompt":true,"theme":"dark","agentPushNotifEnabled":true}
↻ Tick 12 · 20h21 ET · Tailscale-SSH polish · architectural floor hit (honest)

qi said "you do it now." Tried, hit a hard limit. Honest report:

$ sudo tailscale set --ssh=true
2026/05/22 17:20:54 The Tailscale SSH server does not run in sandboxed Tailscale GUI builds.

Tried + verified the floor. The "Install CLI" menubar click would create the same symlink and hit the same sandbox restriction. The unblock is OS-level (swap to non-sandboxed Tailscale), not a click qi missed.

↻ Tick 11 · 20h15 ET · Termius Terminal Multiplayer link from qi

qi shared a Termius Terminal Multiplayer peer-link for "Local Terminal" — co-piloting a real terminal across panes. Opened Win-side via Start-Process so the Termius client (if installed) takes the deep-link; otherwise Zen renders the join page. Relayed to mac-xen for parallel join. Link contains session pw — handled as session-only.

Termius Multiplayer = real-time shared TTY (paid Termius feature). Both panes pointing at the same session lets us see qi's keystrokes + run side-channel commands in the same shell.

★ Tick 10 · 20h14 ET · KEYLESS VERIFIED · password retired

Polish landed. Win-side Ed25519 pubkey installed into xen@xvm:~/.ssh/authorized_keys. SSH now works with no password from Ezekiel.

$ ssh -o PasswordAuthentication=no -o BatchMode=yes xen@xvm 'whoami; hostname; pwd; date'
=== KEYLESS VERIFIED ===
xen
xens-Virtual-Machine.local
/Users/xen
Fri May 22 17:14:06 PDT 2026
★ Tick 9 · 20h03 ET · VERIFIED FROM WINDOWS · SSH end-to-end working

qi said "done" — sshd flipped ON in the guest. Win-side connected via paramiko + env-passed pw + username probe. The UTM/macOS plan is now end-to-end live across the tailnet.

$ ssh xen@xvm 'whoami; hostname; sw_vers; uptime'
xen
xens-Virtual-Machine.local
ProductName:    macOS
ProductVersion: 26.5
BuildVersion:   25F71
17:03  up  2:24, 2 users, load averages: 0.48 0.78 0.94
↻ Tick 8 · 19h07 ET · xvm sshd STILL refused · pw cached in-session

qi supplied the macOS guest pw [redacted · session-only]. Probe retry on 100.92.53.81:22 / 5900 / 8080 — all still connection refused. Network layer still healthy, service layer still bare. Holding the pw in session context for when sshd flips ON; not persisting to disk. Mac-xen unblock command re-relayed with urgency.

↻ Tick 7 · 18h36 ET · xvm LANDED on tailnet · sshd off (unblock needed)

qi fired tailscale ssh xvm. The UTM macOS VM has authenticated onto the tailnet since the last tick — the A/B/C question advanced under us toward option C (host a specific service), though the macOS guest is still bare.

Network state
Unblock — one of these inside the macOS guest
  1. GUI path: System Settings → General → Sharing → toggle Remote Login ON (enables sshd on port 22)
  2. Terminal path: open Terminal in the guest, run sudo systemsetup -setremotelogin on · then sudo dseditgroup -o edit -a $(whoami) -t user com.apple.access_ssh
  3. For Tailscale SSH (no key needed): ensure tailscale up --ssh ran on the guest at install

Mac-xen has UTM-window access to the guest (host = m4 = qi's Mac). Quickest path: mac-xen types the terminal command directly into the UTM window. Once sshd flips ON, tailscale ssh xvm succeeds end-to-end from either Mac or Windows.

↻ Tick 6 · 15h12 ET · csb-G9 SBB audit done · 18+ min uptime
↻ Tick 5 · 15h09 ET · va-G11 converged + 15-min omnimind PR
↻ Tick 4 · 15h00 ET · iOS Shortcut spec landed + 5 qi-only blockers

mac-xen dropped iOS Shortcut spec at ~/.xen/state/xen-tool-call.ios-shortcut.json (Mac-side). Trigger shape: Siri · Watch · NFC · Focus — feeds into the new IFTTT tools-router canon. omnimind.js untouched this turn (preserving the 11-min uptime, good discipline).

qi-only blockers (5)
  1. wrangler login — Cloudflare CLI auth (browser flow on qi's Mac)
  2. CF service token — Cloudflare service-token creation in dashboard
  3. Secret — shared secret value wrangler secret put XEN_TOOLS_TOKEN (composes with [[canon_ifttt_tools_xlrd_org_3layer_auth]] peer-token layer)
  4. Ingress — Cloudflare ingress config / route for tools.xlrd.org
  5. plist — install the iOS Shortcut .shortcut/plist on qi's phone (Allow Untrusted Shortcuts toggle gotcha — see canon_agent_urls:72 for iCloud-link workaround)

Once these 5 land, the Siri/Watch/NFC/Focus → tools-router loop closes end-to-end. Win-Ezekiel updates the /ifttt/ inventory status pills as recipes wire live.

↻ Tick 3 · 14h25 ET · UTM plan-context RESTORED

mac-xen lost local plan-context for a UTM/VM/Linux-peer plan. Win-side search recovered it — three signals converge on option C (host a specific service):

↻ Tick 2 · 14h15 ET · mac-xen delta
Win · Ezekiel

Four shipped.

Stripe → PayPal + Square sweep LIVE
qi corrected "i use paypal and square." Five surfaces swept: /ifttt/, /spine/, /offers/, /sao/, /menu/. Canon paypal_square_money_rails locked. Stripe removed from stack. Live-verified 13:47:55 ET.
Ava TTS autoplay everywhere LIVE
_shared/ava-play.js refactored. Silent autoplay on load + first-gesture unlock listener (pointerdown/touchstart/keydown/scroll/wheel, capture+passive, one-shot). Engaged repeat visitors get true autoplay; everyone else gets audio on first page interaction. Live-verified 13:56:45 ET.
UI-TARS probe (4471 · 4460 · 8080) REPORTED
Win-side: 4471/screen exists as Node proxy at tui-url-server.js:996, hangs 20s+. 4460 = UI-TARS Python serve-uitars.py (PID 48656, ~45h uptime). 8080 = nothing listening anywhere. Full diagnosis relayed to mac-xen.
IFTTT inventory page (carry-over from 13:32) LIVE
12-applet plan at /ifttt/ with PayPal·Payment + Square·Recurring recipes + MCP-unauth state card. Now feeds into the tools.xlrd.org runtime per the new IFTTT canon.
Mac · Xen

Five waves.

Outage caused + recovered RESOLVED
G22 Fix A wrong — STARTUP_GRACE_S=20 < 25-30s cold-start. Reverted to 60s. omnimind UP.
Wave 1 · 5 audits 5 ADVANCED
All settled · 5 advanced.
Wave 2 · 5 populates 2 OK · 3 REJECTED
OK: voice-audio + comms-sms-beeper. Rejected: l7s / governance / life-ops.
Wave 3 · 8 workers 3 DONE · 5 DRAFTED
All settled · 3 done + 5 drafted.
Wave 4 · 4 workers 4 DRAFTED
All settled · 4 drafted patches.
Wave 5 · 4 audits + wakeup ALL REJECTED
Direct mode now.
UI-TARS /click works CONFIRMED
{"q":"..."} POST body required. /screen still hangs. Peer-message to Ezekiel queued — no response path yet.
⚡ Two foundational canons locked this hour
⚠ Open threads — what comes next