Skip to content

feat(rendering): ledger is sole decision core; migrate phone, kill legacy renderer + flags (Stage 3) - #483

Merged
Juliusolsson05 merged 1 commit into
integration/rendering-pipelinefrom
feat/rendering-cutover
Jul 7, 2026
Merged

Juliusolsson05 merged 1 commit into
integration/rendering-pipelinefrom
feat/rendering-cutover

Conversation

@Juliusolsson05

Copy link
Copy Markdown
Owner

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 legacy deriveFeedRenderModel path (no renderItemsOverride). Deleting the legacy renderer would have blanked the phone feed — so the phone was migrated first, then legacy died.

Done

  • useLedgerFeedItems is unconditional — AGENT_CODE_RENDER_PIPELINE (+ probe) and AGENT_CODE_RENDER_SHADOW and 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.
  • Phone migrated: remote SessionView builds a minimal SessionRuntime view (frozen empty ghost plane — no optimistic echo on the phone) and drives the same hook, passing renderItemsOverride like the desktop.
  • deriveFeedRenderModel + sort/visibility helpers + FeedRenderModelInput deleted; Feed's legacy branch deleted. deriveFeedCommittedProjection + feedRenderModelFromItems stay (the former still feeds SemanticStreamingTurn).
  • Shadow deleted (useRenderShadow.ts + shadowParity.test.ts); pure shadowDiff util stays (corpus asserts through it). ledgerFeedItems.test legacy 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

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