71a98f69ee
completeAssistantMessage merged a turn's final text onto its sealed interim bubble only when the session's volatile interimBoundaryPending flag was still true. A subsequent message.start (chained turn, follow-up, or mid-turn compaction) resets that flag to false; when it landed between the same turn's message.interim and message.complete, the flag-based gate fell through and the UI appended a duplicate bubble. Key the merge on the message's OWN durable interim state instead of the session flag. finalContinuesInterim already requires existing.interim plus prefix continuity, so distinct replies (which don't continue the interim) are still appended as their own bubble. Adds a regression test: interim + message.start + completing final that continues the interim must yield one bubble, not two.