Tracks per-lane unread counts for finalized assistant messages. A message counts as unread unless the user is actively reading that lane (current lane, app focused, newest content at the bottom of the viewport). - ChatStore: ephemeral per-lane unread map (markUnread/markLaneRead/unreadFor). - IrisController: 'being read' decision on incoming messages; clears the current lane when the app returns to the foreground at the bottom. - Bridges: push foreground changes to the controller. - ChatScreen: per-channel badges in the drawer/rail, an 'N new' pill in the header (tap glides to the latest message), and a red dot on the hamburger (single-pane/mobile only) when another channel has unread. Closes #3.