Repository navigation
feat(rendering): ledger is sole decision core; migrate phone, kill legacy renderer + flags (Stage 3) - #483
Merged
Juliusolsson05 merged 1 commit intoJul 7, 2026
Conversation
…l legacy renderer + flags (Stage 3) The ownership-ledger pipeline now decides Feed's entire item list for BOTH Feed consumers — the desktop (TileLeaf) and the phone (remote SessionView). The legacy in-Feed decision core is deleted, unconditionally, with no flag. WHY this landed as one PR after a scope discovery: the cutover was going to be a desktop-only flag flip, but the remote phone client turned out to be a SECOND <Feed> consumer still mounting the legacy deriveFeedRenderModel path (it passed no renderItemsOverride). Deleting the legacy renderer would have blanked the phone's feed. So the phone was migrated first, then legacy died. - useLedgerFeedItems is now UNCONDITIONAL — the AGENT_CODE_RENDER_PIPELINE flag, its async probe, and the whole dev-debug plumbing for it (+ the AGENT_CODE_RENDER_SHADOW flag) are gone. Safe because shadow parity was green over the incident corpus + recorded sessions: identical item lists ⇒ identical paint through the unchanged row components. - Phone migrated: remote SessionView builds a minimal SessionRuntime view (frozen empty ghost plane — the phone has no optimistic echo) and drives the same useLedgerFeedItems, passing renderItemsOverride like the desktop. - deriveFeedRenderModel + its sort/visibility helpers + FeedRenderModelInput deleted from renderModel.ts; Feed's legacy branch deleted (maps the ledger's items unconditionally). deriveFeedCommittedProjection + feedRenderModelFromItems stay — the former still feeds SemanticStreamingTurn. - Shadow subsystem deleted (useRenderShadow.ts + shadowParity.test.ts); the pure shadowDiff util stays (bundleCorpus/recordingCorpus assert through it). ledgerFeedItems.test's legacy oracle replaced with explicit expected shapes. NOT in scope — the block-level un-collapse: the view bridge still collapses the ledger's block-level semantic rows into turn-level items for SemanticStreamingTurn. Retiring that component (and selectMergedEntries / committedClaudeMessageTurnIds with it) needs the ledger to own live turns block-by-block through the shared registry dispatch + live visual verification the turn-grain corpus can't give. Tracked in the deletion manifest's status section. Gates: tsc node + web clean; unit 427, renderer 16, integration 30, rendering 163 — all green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This was referenced Jul 7, 2026
This was referenced Jul 9, 2026
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.
The ownership-ledger pipeline now decides Feed's entire item list for both consumers — desktop (TileLeaf) and phone (remote SessionView). The legacy in-Feed decision core is deleted, unconditionally, no flag.
Scope discovery that shaped this PR
It was going to be a desktop-only flag flip. But the remote phone client turned out to be a second
<Feed>consumer still mounting the legacyderiveFeedRenderModelpath (norenderItemsOverride). Deleting the legacy renderer would have blanked the phone feed — so the phone was migrated first, then legacy died.Done
useLedgerFeedItemsis unconditional —AGENT_CODE_RENDER_PIPELINE(+ probe) andAGENT_CODE_RENDER_SHADOWand their dev-debug plumbing are gone. Safe because shadow parity was green over the incident corpus + recorded sessions: identical item lists ⇒ identical paint through unchanged row components.SessionViewbuilds a minimalSessionRuntimeview (frozen empty ghost plane — no optimistic echo on the phone) and drives the same hook, passingrenderItemsOverridelike the desktop.deriveFeedRenderModel+ sort/visibility helpers +FeedRenderModelInputdeleted; Feed's legacy branch deleted.deriveFeedCommittedProjection+feedRenderModelFromItemsstay (the former still feedsSemanticStreamingTurn).useRenderShadow.ts+shadowParity.test.ts); pureshadowDiffutil stays (corpus asserts through it).ledgerFeedItems.testlegacy oracle → explicit expected shapes.Not in scope — block-level un-collapse
The view bridge still collapses the ledger's block-level semantic rows into turn-level items for
SemanticStreamingTurn. Retiring that component (+selectMergedEntries/committedClaudeMessageTurnIds) needs the ledger to own live turns block-by-block through the shared registry dispatch, with live visual verification. Tracked in the deletion manifest status section.−665 net lines. Gates: tsc node + web clean; unit 427, renderer 16, integration 30, rendering 163 — all green.
🤖 Generated with Claude Code