Skip to content

Fix notification display lookup for live outgoing messages - #1388

Merged
trissim merged 1 commit into
mainfrom
work/pi-publication-carry--9075c6132544440ab7c3ff9744a8e6dc--toad
Oct 31, 2026
Merged

trissim merged 1 commit into
mainfrom
work/pi-publication-carry--9075c6132544440ab7c3ff9744a8e6dc--toad

Conversation

@trissim

@trissim trissim commented Oct 31, 2026

Copy link
Copy Markdown

Summary

1 source-owner repair, 1 file, +6/-0 lines. Today's retained census contains 58 saved reports of OutgoingMessage missing notification_identity_for; this is one incomplete inherited contract, not 58 independent bugs. Post-install error counts are not yet claimed.

Mechanism and class structure

Before: ConversationEntry owns notification_targets(). Both live OutgoingMessage and LineHistory are entries, but the display-cut lookup exists only on SourceNotifications, mixed into LineHistory. HistoryNotifications.notification_read() calls the lookup on either target. Live outgoing blocks therefore raise AttributeError, including during tab/source retirement.

After: ConversationEntry.notification_identity_for() provides the concrete NoDisplaySelection default. Live tool-sent blocks do not carry a prepared BUS display cut and must not manufacture one from the current tab. SourceNotifications retains its existing override, which returns the construction-time identity from matching visible BUS fragments. Python's MRO supplies both behaviors; no caller-side type switch, hasattr, exception suppression, wrapper, schema or state mirror is added.

This is IMPL-4: the shared notification lookup contract was half implemented. Fact: the display cut available from an entry. At: the previous absent method beside ConversationEntry.notification_targets, consumed at widgets/message_notifications.py:136. Derive: base-method default, with the existing source override. By: ConversationEntry and SourceNotifications. Paper1 Theorem 4.6 identifies outside supply; Theorem 4.8 keeps the different source/live answers separate while sharing their contract.

Deleted / retained

  • Deleted no data, sources, history or existing source identity behavior.
  • No compatibility alias or alternate implementation.
  • SourceNotifications' captured identity lookup remains the MRO winner for LineHistory.

Evidence and verification

  • Full bounded original-log scan: 85 files / 17,016,557 bytes; 13 protocol logs and 72 saved traceback reports across five groups. This snapshot covers standard-directory files captured or appended on 2026-10-31 local time, to each file's captured byte boundary; two active files grew afterward. Four protocol error responses are counted separately, not confused with exception report counts or text inside conversation payloads. Custom TOAD_LOG paths are not yet certified.
  • NRA's existing parser enumerated 1,184 production modules across current Toad, installed Core and Textual, before edits. Syntactic enumeration is not a dynamic behavior proof; third-party bases outside those roots are explicit coverage limits.
  • Source-backed imports and changed-owner parse passed. Actual MRO inspection: OutgoingMessage resolves to ConversationEntry.notification_identity_for; LineHistory still resolves to SourceNotifications.notification_identity_for.
  • Existing overlapping PRs Toad suite: find the conftest.py:93 hang, fix link and Core-type drift #1375/P1022: migrate stale Core test callers and verify main pushes #1368 change an older ReadNotifications API and do not supply the missing shared method; P918: relocate current ToAD consumers to Core nominal owners #1330's block_navigation change is an import migration.
  • No pytest or synthetic application run: project policy requires the actual Toad application. Installation and live message/notification/tab-retirement acceptance remain with the shared integration owner, pi-commander. This PR is a published source repair, not a claim that the installed build is fixed.

Assumed: no unverified source-lookup assumption; actual installed UI behavior remains to be exercised and recorded.

Copilot AI balanced review requested due to automatic review settings October 31, 2026 20:12

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.

@trissim
trissim merged commit 4ee4d9c into main Oct 31, 2026
0 of 2 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