Skip to content

Put sidebar state and listing selection in their existing owners - #986

Closed
trissim wants to merge 19 commits into
mainfrom
fix/sidebar-observation-owner
Closed

trissim wants to merge 19 commits into
mainfrom
fix/sidebar-observation-owner

Conversation

@trissim

@trissim trissim commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Paired sidebar ownership repair

Unfinished checkpoint: f1e3866e0. Do not build/install yet. Toad #694 still pins the earlier Core 04d414e4b; its updated unread/notice consumers are local and will receive the final Core pin once the complete change is ready.

The ordered finish is zero | None annotations in both historical_views.py and sidebar.py. Current checkpoint counts are 0 and 1, not complete. Historical births now consume E2E's #965 incarnation family, normally integrated at published owner checkpoint 0b94c628 (merge 1647cba34); the remaining row model value will consume UI2's #987 canonical thread model. #965 remains a draft dependency, not a feature implemented by this PR. Its newer birth_description API awaits owner review/integration for the paired Toad header. Model/context integration must use UI2's final owner, not its rejected interim runtime-label implementation.

The observation family existed, but callers kept recovering its state from a nullable snapshot. That was pointless: the family now answers order, read notice, filters, unread state and thread-row construction. Waiting/failed observations give an unobserved unread result and no notice, use the empty view's default ordering, and refuse requests for unavailable snapshot/filter data; a failed member raises its original error. ObservedSidebar owns the real snapshot and answers from it. SidebarModel.snapshot is deleted, not replaced with another availability flag.

CoordinationSnapshot now owns one ListingFilter value instead of two independent fields. The current row model takes an UnreadPresentation, never an optional snapshot. Toad removes its snapshot probes, asks the family for unread state, and renders the model's canonical keyed rows; it does not add widget state copies.

The channel-member loop now uses threads.keys() once per derive() rather than rebuilding all thread names for each member. Channel owns its tag description: #all/#any/#none render their actual BuiltinChannel member, not a false 'all' fallback. String tags themselves have no all-member.

Source evidence

NRA ModuleSyntaxIndex before/after query covers Core src/tools/tests, paired Toad and Python dependencies. Exact classes, fields, imports and consumers are in .artifacts/sidebar-observation/. Computed imports/calls and compiled dependency internals are not statically proved.

sidebar.py current counts: is not None 2 → 0; | None 6 → 1. The remaining row model annotation awaits #987. Observation methods are now channel_unread(target) and bus_unread(target); snapshot callbacks and their function-local imports are deleted. The read ledger decodes its native text/null value once through the existing WireValue capability into a notice member. Null means NoReadMarkerNotice; empty text is malformed and is rejected by the text member's own invariant. The no-notice member has no data field and encodes native null. Case-specific messages/take answers are abstract on the base and implemented by the two members; the shared repeat-suppression algorithm remains on the base. Waiting sidebar observations return NoReadMarkerNotice. Toad's notifier consumes the notice's messages rather than testing nullable text.

historical_views.py current counts: | None 8 → 0. HistoricalMessage retains sender_incarnation/target_incarnation; the original declaration supplies its existing member under the original message name, while absent/later births produce the owning family's Unrecorded member. Nullable copied birth floats and old metadata fields are deleted. Declared archive/specific viewers own page reading and human display evidence. HistoryTargets owns unrestricted/named membership, offset constraints and clock/count reduction across all source consumers; nullable target sets are removed, including the page index. The disposable display-checkpoint format is now schema 4, so old derived files are not decoded as the new shape. Durable channel/read-ledger formats remain unchanged.

Source APIs are split into attach_history(path)/attach_original_history(source) and historical_threads()/historical_thread(name). Original-source validation brackets the copy through the original HistorySource owner; the common archive writer has no optional source argument. Tool and test consumers are migrated. Historical reader source/revision fences remain strict.

Verification in progress

Actual Core sidebar roster/derivation on the configured live root completed: 73 visible thread rows, 11 channels, correct distinct #all/#any/#none descriptions and the original ListingFilter object. This was 0.063s for this bounded read, not a UI latency claim. No provider input.

Core checks: 40 passed / 1 unchanged-main failure in 39.16s. The existing test_unreadable_history_observation.py:86 asks for ThreadStatusModel.available, which the unchanged main status model no longer declares; the test and owning class match the base source. That failure is preserved in focused.log and was sent to Codex for the existing status-model owner; no compatibility flag was added and no assertion was removed.

The earlier published pair's Core and Toad production debt checks passed with zero increases. New checkpoint verification remains in progress: 36 targeted API checks passed in 39.88s before the final notice-decoder correction; the final notice contract has 3 checks passed in 0.49s. Actual attached immutable archives (2 sources) supplied a bounded original row with typed sender/target births and public-codec roundtrips; original source fences held, and no input or source attach occurred. This is source checkout/backend evidence, not installed pair/UI evidence. The larger serial selection batch reached its 75-second bound, the post-birth batch its 55-second bound, and the combined ratchet its 40-second bound; incomplete results are preserved, not called passes. Final coherent dependency verification will use appropriately bounded serial batches. No Toad tests or synthetic app are being used.

The actual paired st/isolated-display saved-session UI check is waiting for Codex's reviewed build. It stays with this implementation owner. No shared installation or UI success is claimed; no Toad tests or synthetic application. No new native/provider input. The ordered deadline is 16:00 EDT, as the fleet board specifies, not UTC. Source and generated evidence stay in the existing owned checkouts; progress.json records the exact heads, results, owner and next step.

@trissim

trissim commented Oct 19, 2026

Copy link
Copy Markdown
Contributor Author

no owner; reopen with a new order

@trissim trissim closed this Oct 19, 2026
@trissim
trissim deleted the fix/sidebar-observation-owner branch October 20, 2026 10:39
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.

1 participant