Composed test candidate: relay typed errors + harness login (#36828 + #36846 + #36847), do not merge

Draft
TE
18h ago
+1087-102

HOLD: composed DEV test candidate only; never merge. Each part lands through its own PR.

Leo: "I thought we had better typed errors than this. I thought we had a better solution than whatever was going on here."

This branch is feat-cmux-next 3aff3dd3 (with #36828, the producer, merged as 1c2d2e13) plus two open PRs, so one DEV build can test the producer, the consumer and the login step together:

  • #36847 (consumer; the app keeps the relay's typed error fields) at 0681c10e.
  • #36846 (claude-13: the harness login before the relay send, with the cloud.relay.login_* guard and no fallback, including login_account_changed) at exactly 563db483.

The only change beyond the three merges: #36846 moved relayFields into CloudStartSession+RelayChat.swift, so #36847's typed fields are there. The guardrails pass over the whole diff from feat-cmux-next with no skip; #36846 carries its own app-size exception.

Changelog

none

Agent session: agent session