From da719adaec4439e24b8f7e4e4116923288cbaaae Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Fri, 30 Oct 2026 21:29:33 -0400 Subject: [PATCH] Stop faking an event so one caller can consume a presentation thread_observed took ThreadRowsChanged | None so observe_thread could call it with nothing, and never read the event. The subscriber now takes its event and calls consume_thread_presentation; observe_thread calls that directly. Removes the NoneAbsence growth #1381 brought in. Co-Authored-By: Claude Opus 5.5 --- src/toad/transcript_publication.py | 2 +- src/toad/widgets/conversation.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/toad/transcript_publication.py b/src/toad/transcript_publication.py index 18bbe3567..aef0c8613 100644 --- a/src/toad/transcript_publication.py +++ b/src/toad/transcript_publication.py @@ -617,7 +617,7 @@ def observe_thread(self, owner: TranscriptPresentation) -> None: ) ) # The shared status may already be published before this view subscribes. - view.thread_observed() + view.consume_thread_presentation() @property def reports_coverage(self): diff --git a/src/toad/widgets/conversation.py b/src/toad/widgets/conversation.py index 59a8c317f..a948197cc 100644 --- a/src/toad/widgets/conversation.py +++ b/src/toad/widgets/conversation.py @@ -462,7 +462,10 @@ def arm_thread_read(self) -> None: """Capture turn token and client authority for the next observed presentation.""" self._thread_read = self.agent_binding.thread_read() - def thread_observed(self, event: core_events.ThreadRowsChanged | None = None) -> None: + def thread_observed(self, event: core_events.ThreadRowsChanged) -> None: + self.consume_thread_presentation() + + def consume_thread_presentation(self) -> None: """Consume this thread's one observed presentation.""" presentation = self.app.coordination_access.thread_status.open( self.status_thread().name