32ca343c83
A bot's canonical chat is the relationship — /new inside one would fork it into a scratch session, so the composer reroutes /new to /compact there. The guard deciding "is this chat the canonical one" read host.activeSessionId, which is not on the host: the real atoms are host.state.activeSessionId (runtime id) and host.state.focusedStoredSessionId (stored id). The optional chain swallowed it, the comparison ran against null every turn, and /new reset forever-chats for as long as the guard shipped. It reads the focused STORED id now, which is the id space canonical_session reports in. The comparison itself moves into isCanonicalChatOnScreen so a test can drive it — matching either the durable registry row or the compression-lineage tip, since a compacted Bot Chat is on screen under its tip id while the registry still names it by the root.