Repository navigation
Conversation
…omms#3538) ReadDeliveryOverview restated Core's input-delivery read with its own include_history; Core deleted it. Toad now sends ReadOwnerOperation carrying InputDeliveryRead(include_history=...) to the held owner and wraps the owner's DeliveryOverview in ReadDeliveryView. No-coordination DeliveryView, require_owner and dismiss_historical_inputs are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RnH6dS2Kmg1WxNnAc78YHA
…ms#3538) tests/native/test_native_goal_owner.py: with the real native session, after until_agent_ready(), controller.input_delivery() and controller.input_delivery(include_history=True) are each a ReadDeliveryView whose overview has current_scope OwnerQueueInputDeliveryScope (only the live owner yields it; the no-coordination DeliveryView and the unobserved projection never do), and on the fresh private wire empty inputs and historical_inputs with zero counts. No mocked read, operation, owner or reply. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RnH6dS2Kmg1WxNnAc78YHA
…e root (agent-comms#3538) Core moved the notification read off the UI request: LiveNotificationRead and RecordedNotificationRead own references (and the archive), and ReadNotifications(root, operation) is the one UI envelope. - HistoryNotifications.notification_request (a ReadNotifications class used as a root+references constructor) becomes notification_operation, a root-free operation constructor (LiveNotificationRead by default). notification_read binds the ProjectPathOwner root: ReadNotifications(root, operation(refs)). - RecordedContents sets partial(RecordedNotificationRead, source=source). ReadRecordedNotifications is gone. - comms_root keeps keying views and outcomes by the full UI request. - tests: the historical source test requires the generic envelope with RecordedNotificationRead((reference,), source.key); the observation shutdown test builds its request with LiveNotificationRead. Assertions unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RnH6dS2Kmg1WxNnAc78YHA
…operation's references (agent-comms#3538)
Both shutdown tests called process.fileno() to unhook a readiness callback that
ObservationProcess no longer has. The one receiver started at activation keeps
running after stop_observing, so the answer has to be held where it is made: in
this test's own observer child.
- test_stopping_observation_keeps_reads_but_sends_no_late_interest proves the
child is ready with an empty-window read and SIGSTOPs it (stop confirmed by a
bounded WNOHANG|WUNTRACED wait). It then registers the real read, stops
observing with every AnsweringReads identity check and the no-late-interest
profile, and SIGCONTs the child. The same receiver settles the read:
set(result.outcomes) is the message's seq/id.
- test_an_observer_dying_during_shutdown_still_releases_its_resources holds the
child, registers a pending empty-window read and SIGKILLs the child.
- The read fails with ObserverDied carrying that pid and -SIGKILL.
- StopSidebar and StopObserving each raise that same object.
- Teardown may report it only as that same cause, and other grouped errors
propagate.
- The connection is closed, the child is gone and nothing is retiring.
- Every path resumes a still-stopped live child and settles any unconsumed read.
- The four paint-fixture reads of request.references now read
request.operation.references; ReadNotifications has no references of its own.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RnH6dS2Kmg1WxNnAc78YHA
…on (agent-comms#3538) read_thread_presentation returned the acquired presentation to Conversation and ObservedSourcePublication, carrying the notification window and backend records into the UI. It now returns .published(), the source-free ThreadPresentation; settlement still reads its read_identity. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RnH6dS2Kmg1WxNnAc78YHA
…ion (#1302) The commander page wraps CommanderUnitRead(commander, unit, orders) in the UI's ReadOperation envelope instead of the deleted ReadCommanderUnit. Request id, root, card/collapsed fencing, worker cancellation and the unavailable-detail display are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RnH6dS2Kmg1WxNnAc78YHA
…#1302) acp/agent.get_goal_snapshot sends ReadOwnerOperation(wire_root, thread, operation=OwnerGoalRead()) through its existing transcript reader instead of the deleted ReadOwnerGoal. The local NoGoal/Idle answer without coordination, the ClientSessionRequest authority, OwnerSnapshotConsumer's captured turn token, the post-read require_owner and dispatch of every meta.batch update are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RnH6dS2Kmg1WxNnAc78YHA
) KnownTranscript.snapshot_request and update_request, and the historical sessions screen, build their UI envelope around TranscriptPageRead with every original cursor and the attached source key; root and publication state stay on the envelope. acp/transcript_reader's RefreshTranscript keeps its original identity. A recorded-reader test asserts the exact page arguments on the operation and root/previous on the envelope. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RnH6dS2Kmg1WxNnAc78YHA
…/input-delivery-owner-read
Config only, authorized by root (bus 36182) for the P883 matched cut. The checker guessed the root from src/dot; tools/acceptance.py:34-36 already declares tools as a script root for its sibling imports (performance.*), so mypy_path names both roots instead of guessing one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RnH6dS2Kmg1WxNnAc78YHA
…teg-20261029-toad
…teg-20261029-toad
…teg-20261029-toad # Conflicts: # tests/textual/test_historical_notification_source.py
historical_sessions keeps #1302's TranscriptPageRead import beside the shared notification reads; message_notifications takes #1317's read, which passes the captured display to ReadNotifications(display=...), the field the Core carrier (agent-comms #3566) now declares. Loads and imports against the carrier's Core source. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RnH6dR85kyFKcc2tQAJLhK
This was referenced Oct 29, 2026
The page API carried before/after/through as TranscriptCursor | None, restating "no bound" as None. Readers, scopes and windows now pass a PagePosition (LatestPage, EarlierThan, LaterThan) and a PageLimit (AtFrontier, Through); cursors build their own positions, and a changed transcript asks its cursor whether a commit is required. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RnH6dR85kyFKcc2tQAJLhK
This was referenced Oct 29, 2026
This was referenced Oct 30, 2026
Author
trissim
added a commit
that referenced
this pull request
Oct 30, 2026
Combined carrier: Toad #1319 paired with agent-comms #3566
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Four source-repair commits across37 files:+403/-659 against the reviewed baseline, including248 deleted test/peer lines;30 production modules changed by the repairs. One integration of #1302 and #1317, paired with agent-comms#3566. Queue refresh no longer rebuilds a notification request per message or searches retained pages. Native queue refresh never reads BUS fragment entries. Unread, filtered and scrolled-up paints return a declared no-work result before creating a worker or opening a transaction.
Source checkpoint, not installed or live-qualified. No measured frame-time or bus-latency improvement is claimed. Root owns the matched carry and actual saved DM/channel/CLI/native journey. The existing carrier branch and this PR are retained; parent checkouts are untouched. Current main is integrated normally.
Queue evidence and the import hierarchy
Before: each BusMessageFragment constructed ReadNotifications, whose builder walked visible targets and retained pages to rediscover a prepared page's display identity. The screen's module also contained the fragment's data type, creating a reverse import dependency.
After:
This deletes visible × (visible + retained-fragment) work from queue refresh. That is a source relationship, not a measured speedup.
Captured requests own confirmation behavior
Before: shared
_promptreturned None for missing confirmation; clear/send-now converted it to bool; NativeQueueSource converted False into an exception.After: QueueSessionRequest(ClientSessionRequest) specializes unconfirmed handling to raise QueueActionRefused. The ordinary captured request keeps its existing failure-publication behavior. The shared controller still owns transport, captured session/scope, actual failure reporting and deferred-input ordering. Clear/send-now await confirmed completion and return nothing; the bool conversion and dead optional-command branches are deleted. Queue control requests use their real CommsRequest parent, since ClearQueueRequest and SendNowRequest are not PromptRequest subclasses.
Unexpected ValueError still escapes. Missing confirmation never grants retry permission or proves that no side effect occurred. Drafts, accepted producers, uncertain inputs and backend membership remain with their original owners.
Source capabilities, not a submissions-to-view forwarding cycle
QueueSource actions receive the actual AgentPresentation and captured scope. QueueInspection receives one QueueEvidence and the existing repaint callback, never a submissions object to walk back through its view. Its consumers read presentation directly from that evidence; no second presentation attribute is maintained. InputSubmission matching takes the same existing transaction owner as execution, deleting the reverse Conversation import. UI error rendering belongs to Conversation. QueueActionRefused lives with the actual queue attachment below presentation and screens.
The third review required actual ConversationSubmissions annotations on all three ConversationKind.prompt signatures. A retained NRA import map exposed two reverse paths, rather than just a typing inconvenience:
conversation_submission -> core.input_events -> navigation_target -> conversation_kind: SelectTarget now lives with NavigationTarget, and every production/test consumer imports it there. The primitive input-events module no longer imports the navigation hierarchy; no re-export is retained.conversation_submission -> submission_queue -> ToolContent -> linked_rows -> navigation_target: QueueInspection moved unchanged in behavior to screens/queue.py. The existing Conversation.open_queue_menu constructs it; the transaction model no longer imports or constructs the modal. Its dead queue_source forwarding property is deleted.ConversationKind now imports ConversationSubmissions, ChannelPrompt and MessagePrompt at top level. Three function-local prompt-widget imports are deleted. QueueEvidence also defers notification-target acquisition, so native refreshes do not even perform the former visible-widget walk. The after-map has no reverse top-level import path from submissions to conversation kind.
The three reviewed modules—submission_queue.py, conversation_submission.py and agent_presentation.py—have no TYPE_CHECKING blocks or local imports. This does not claim removal of unrelated pre-existing guards throughout ToAD.
Painted reads: no work means no transaction
The first repair correctly replaced nullable transcript cursors but put the no-op too deep: ReadyContent created a read worker, which opened access.write before UnreadTranscriptCursor did nothing. That was a real regression, not a successful no-op.
Now Conversation.painted_read returns NothingToRead for unmounted, filtered, scrolled-up or blocked views. Otherwise the cursor's painted_read chooses the result: UnreadTranscriptCursor returns NothingToRead without invoking the callback; a positioned cursor invokes it. ReadyContent.read_work constructs route/read/write work only on that latter path. The obsolete visible_read_cursor property is deleted. No type switch or cursor-None test replaces it.
TranscriptPresentation initializes/resets to UnreadTranscriptCursor and refresh asks requires_commit(). PageRequest and TranscriptPageWork accept actual cursors. The separate older-page caching fact is owned by PageRevision, while GrowingPageRevision adds the newer read's frontier. The former work_cursor/None marker is deleted, so new arrivals do not invalidate immutable older-page keys.
Remaining competing decisions removed
Paired API and publication order
Core's answer family is pushed, not a promise: #3566 at22c0ef74e introduced MessageNotification.answer: AssignmentResponse and detail_texts(), with answer time on AnsweredResponse. The cursor's pre-write choice is pushed atd06847ad0. Both declarations were inspected from Git HEAD before publishing this consumer correction.
ToAD uses answer.detail_texts() without an optional-reference probe. EmptyCheckedNotifications owns empty disclosure text. TranscriptScope and CoordinationTranscriptReader carry PageSource directly: LivePageSource by default or RecordedPageSource(HistorySourceKey). Historical notification reads take the same nominal HistorySourceKey. Nullable historical-source strings and the old keyword are deleted, not retained as compatibility paths.
Verification and limits
ok MODULE; final output isall 30 touched modules imported in fresh processes against paired Core source, exit0. Source hashes are retained in review3-imports.log. The final deletion of the unused submissions queue_source forwarder received a targeted fresh-process reproof, also ok/exit0.Assumed: root lands the paired Core before or with this consumer, runs the combined acceptance on the matched heads, and verifies actual Clear/Send now, DM/channel/CLI/native coverage, stale scopes, drafts/mentions, growing history, scroll-up paints and tab return. Source approval, imports, merges and an installed working queue are distinct facts.