#1792·happy

iOS: Happy Agent-kind machine is never selectable as a spawn target (absent from Machines list and Machine picker; project '+' substitutes the CLI-daemon machine)

Author: venkuht1997Created Sep 15, 2026Updated Sep 15, 2026

Summary

A Happy Agent-kind machine registered by the Happy desktop app is never selectable as a spawn target in the iOS client, even though the client clearly knows about it: it renders as a session-group header, and its machine detail page works and reports online.

Concretely, on one Mac with both runtimes installed there are two machine registrations with different machine IDs but an identical Host and Home Directory:

Display name Machine ID Registered by
MBP 14 1418fd31-… npm happy CLI daemon v1.2.4
<hostname> — Happy Agent 62017256-… happy-agent v0.4.68, launched by Happy.app v0.0.85

Both are online to the same relay at the same time. The Happy Agent machine is:

  • absent from Settings → Agents → MACHINES (which lists only the two CLI-daemon machines, including one on a different physical Mac)
  • absent from the new-session composer's Machine dropdown
  • present as a session-list group header, with its three sessions correctly attached
  • present and online on its own machine detail page (reachable by tapping one of those sessions), showing correct Host, Machine ID, Platform, Daemon State Version and Last Known PID

The sharpest symptom

Tapping the per-project + on a row that belongs to the Happy Agent machine opens a composer pre-filled with Machine: MBP 14 — a different machine — while keeping the Happy Agent project's directory.

The result is that sessions intended for the Happy Agent machine are spawned on the CLI-daemon machine, in the Happy Agent's own workspace directory. Server-side this is visible as the CLI daemon receiving:

"method": "<cli-machine-id>:spawn-happy-session"
[API MACHINE] Spawning session with params: {"type":"spawn-in-directory",
  "directory":"~/Happy/Workspaces/<project>/<dir>", "agent":"claude", ...}

Those sessions then do not appear in the Happy desktop app, because they belong to the other machine. So there is no route from the phone to a Happy Agent session.

Steps to reproduce

  1. Pair a Mac with the npm happy CLI and let its daemon register a machine (here: MBP 14).
  2. On the same Mac, install Happy.app v0.0.85 and let its bundled happy-agent v0.4.68 start. It imports credentials from ~/.happy and registers a second machine with the same Host and Home Directory but a new machine ID.
  3. Create a project/session in the desktop app so the Happy Agent machine has sessions.
  4. On iOS, open Settings → Agents → Machines. The Happy Agent machine is not listed.
  5. Start a new session. The Machine dropdown does not offer it.
  6. Tap the + beside one of that machine's own project rows in the session list. The composer is pre-filled with the CLI-daemon machine instead.

Expected

A Happy Agent-kind machine should be listed in Settings → Agents → Machines and offered in the Machine picker, and a + scoped to one of its projects should target that machine — matching the documented capability in the shipped docs/happy.md:

"…and ask the machine to spawn a new session in a directory, choosing the provider, model, effort, and permission mode."

Actual

It is absent from both selectors, and the project-scoped + silently substitutes a different machine.

Notes / possible causes

I could not determine the mechanism from the client side. Candidates that all produce identical observables:

  • the machine list / picker de-duplicates by Host (or Host + Home Directory) rather than by machine ID, so the CLI machine shadows the Happy Agent machine. The two collide on both fields here; the machine that does render is on a different host.
  • the machine list / picker filters by machine kind and does not include Happy Agent-kind machines.
  • the filtering happens server-side, before the client sees the record.

Worth noting the session-list grouping renders the two machines as separate headers, so whatever excludes it is specific to the Machines list and the spawn picker, not to the client's ability to tell the two records apart.

Also: the agent's locally configured node name (happy_agent_node.name in ~/.happy/agent/agent.sqlite) is not what the client displays — the client shows <hostname> — Happy Agent instead. Possibly related to how the display name is published or selected, possibly unrelated.

Force-quitting and relaunching the iOS app did not change any of the above.

Environment

  • macOS 26.3.1, Apple M4 Pro
  • Happy.app 0.0.85 (com.slopus.happy)
  • happy-agent 0.4.68
  • npm happy CLI 1.2.4 (upgraded from 1.2.0 at the time the desktop app was first launched)
  • Relay: api.cluster-fluster.com (hosted)
  • iOS client: current App Store build as of 2026-09-15

Hostname and machine UUIDs partially redacted; happy to supply them privately if useful.