Warm channel heads in the background before they are opened - #54
Merged
Merged
Conversation
Sessions created with warm: true (production wiring) warm every roster channel's head after discovery: starred channels first, then the rest by head recency, never-fetched last. Warming runs one background-priority read at a time, skips channels with an open window (demand owns those), skips heads inside their freshness lease, and drops pending work when the session resets or the cache clears. Starred order comes from account sidebar preferences, so the session loads them at startup and warming waits for them to settle. Restored disk heads are picked up at drain time, so hydration finishing after discovery still reorders warmth by recency. Sessions without the option keep the existing invariant that discovery never reads unopened channel heads. Signed-off-by: Charlie Croom <ccroom@squareup.com> Amp-Thread-ID: https://ampcode.com/threads/T-01a0a053-f85b-754c-a353-03fb77a26363 Co-authored-by: Amp <amp@ampcode.com>
The journey asserted that no reads follow the baseline beyond focused-row preparation for two channels. With warm: true, the serial background warm pass legitimately reads the rest of the roster during that window, so the assertion raced the drain (webkit timing). Its durable intent — cue and scroll interactions never re-read a channel — is now asserted directly: every read after the baseline targets a distinct channel. Signed-off-by: Charlie Croom <ccroom@squareup.com> Amp-Thread-ID: https://ampcode.com/threads/T-01a0a053-f85b-754c-a353-03fb77a26363 Co-authored-by: Amp <amp@ampcode.com>
Background head reads now prepare that channel's avatar URLs via media.warm(), which appends to the speculation queue after profiles resolve instead of displacing focused-channel intents. Speculative warming (hover head reads, the background drain, avatar preparation) is skipped under the Save-Data preference. Signed-off-by: Charlie Croom <ccroom@squareup.com> Co-authored-by: Amp <amp@ampcode.com> Signed-off-by: Charlie Croom <ccroom@squareup.com> Amp-Thread-ID: https://ampcode.com/threads/T-01a0a053-f85b-754c-a353-03fb77a26363
…d media, dev tab) Signed-off-by: Charlie Croom <ccroom@squareup.com> Amp-Thread-ID: https://ampcode.com/threads/T-01a0a053-f85b-754c-a353-03fb77a26363 Co-authored-by: Amp <amp@ampcode.com>
delkc
added a commit
that referenced
this pull request
Sep 15, 2026
* origin/main: Fix inline mention styling in channels (#74) Fix self-replenishing background channel warming (#71) Add links and thread previews (#42) Add shared receive-only channel and thread typing (#33) Warm channel heads in the background before they are opened (#54) Add Developer settings tab with cache clear and broker stats (#53) Request sized relay media for avatars (#58) Allow parallel browser development ports (#57) Add worktree bootstrap for local configuration (#56) Make thread opens part of navigation history (#55) Remove the decoded-avatar hot set; respect Save-Data (#60) Add CODEOWNERS reviewers (#61) Add guarded Workflows page and session capability (#48) Signed-off-by: Clay Delk <clay.delk@gmail.com> # Conflicts: # dev/relay-broker.mjs # src/bundled/channels/ChannelsPage.tsx # src/features/messages/ChannelTimeline.tsx # src/features/messages/MessageComposer.tsx # src/features/messages/MessageRow.tsx # src/features/messages/ThreadPanel.test.tsx # src/features/messages/ThreadPanel.tsx
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.
What
Sessions created with
warm: true(enabled inprovideRelay, alongsideprepared: true) warm every roster channel's head after discovery, so opening a channel — even after a cold start — finds its timeline already local:media.warm(), which appends to the speculation queue after profile enrichment resolves instead of displacing focused-channel intents (capped queue, existing two-request concurrency).navigator.connection.saveData, all speculative warming is disabled — the hover speculative head read, the background drain, and avatar preparation. Demand fetches are untouched.clearCache()runs (so the Developer-tab clear-cache button from Add Developer settings tab with cache clear and broker stats #53 exercises a true cold load).Sessions without the option keep the existing, test-encoded invariant that discovery never reads unopened channel heads — the existing relay tests pass unchanged; the new behavior is opt-in at the same boundary as
prepared.Validation
src/features/relay/warm.test.ts(deterministic scripted transport, no sleeps): cold-load auto-warm with serial ordering; starred/recency/never-fetched order; freshness-lease skip on re-trigger; open-channel skip.pnpm vitest run src/features/relay);pnpm typecheckand biome clean on touched files.Deferred checks
🤖 Description written by AI (Amp); commits signed off by the agent on Charlie Croom's behalf per DCO.