Composed test candidate: relay typed errors + harness login (#36828 + #36846 + #36847), do not merge
Draft
TE
18h ago+1087+1087+0123456789012345678901234567890123456789-102-102-012345678901234567890123456789
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, includinglogin_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