The UI phase built a surface that derives everything from evidence and never reads a stored enum — and then a bridge sat on it reading connected for nine and a half hours while deaf. Four facts, all healthy, all true, and none of them measuring the thing that was broken.
This phase adds the fifth fact: did the join actually succeed? Liveness travels the agent-key path, which resolves an agent and never touches a channel, so it can only ever prove the process. Membership is a different question, and until something asked it, a bridge that could not hear was indistinguishable from a healthy one.
Several findings had to be established first, and one of them reversed an assumption the whole program had been carrying: a re-sent join is re-checked, so retrying in place actually works. The chain as the code truly evaluates it turned out to differ from how it had been written down — only post visibility refuses a join, while membership and the channel ACL govern the reply — and that correction was made in the earlier phase’s doc rather than quietly folded in here.
Two more, both about legibility rather than logic: the ACL form is not silent, but its default is a no-op, so an operator can complete it and grant nothing; and an error envelope carries no id and no channel id, so it cannot be attributed to what caused it. That last one is why fixing one link and retrying looks identical to the fix not working.