Skip to content

Combined carrier: Toad #1319 paired with agent-comms #3566 - #1359

Merged
trissim merged 40 commits into
mainfrom
batch/integ-3566-toad
Oct 30, 2026
Merged

trissim merged 40 commits into
mainfrom
batch/integ-3566-toad

Conversation

@trissim

@trissim trissim commented Oct 30, 2026

Copy link
Copy Markdown

Toad companion carrier for OpenHCSDev/agent-comms#3670 (carrier of #3566). toad#1319 (9dff68c) merged onto main a78684c; screens/commander.py resolved to main's selection-driven details using #1319's ReadOperation + CommanderUnitRead. Every Toad module imports against the combined Core.

🤖 Generated with Claude Code

https://claude.ai/code/session_01XbFMSoWgC3ZwKzjT4SwMDu

trissim and others added 30 commits October 28, 2026 06:33
…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
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

# 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
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
…refresh

# Conflicts:
#	src/toad/acp/transcript_reader.py
#	src/toad/widgets/comms_chat.py
#	src/toad/wire_history.py
@trissim
trissim marked this pull request as ready for review October 30, 2026 18:21
Copilot AI balanced review requested due to automatic review settings October 30, 2026 18:21

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota. Try requesting a review at a lower effort level.

An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XbFMSpSd8zQxyozgEV2Re7
trissim and others added 2 commits October 30, 2026 17:23
Conflicts were import lists and one docstring: native_input_record keeps
ThreadLookup and drops main's now-unused WireName; phase_evidence takes
main's Checkout history with the carrier's MergeHeadReview.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XbFMSpSd8zQxyozgEV2Re7
WireSource.read called WireFragment.of without page=, while from_message requires it for
its notification identity, so every channel read raised TypeError inside the read worker
and the channel sat on "Loading messages..." forever. The merged-pair tests caught it.
Helper and read-reference tests move to the shapes the pair declares.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XbFMSpSd8zQxyozgEV2Re7
@trissim
trissim enabled auto-merge October 30, 2026 22:40
@trissim
trissim merged commit 6bdc5b8 into main Oct 30, 2026
1 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants