Conversation
The owner cell on the default branch row in `daft prune` and `daft sync` shimmered for the entire run. The synchronous seed (`collect_worktree_info`) deliberately returns `None` for the default branch's owner (`resolve_owner_with_fallbacks` short-circuits when `branch == base`), so `info.owner` is empty by design. The streaming collector in prune/sync, however, only requests heavy fields (size / mtime / *_lines) — never `OWNER` — so no `Owner` patch ever arrives to mark the bit as received. With `vals.owner` empty and the OWNER bit unset in `received_patches`, the render path always took the `is_cell_loading` branch and animated the shimmer indefinitely. Plumb a new `seeded_fields: FieldSet` through `TableConfig` / `TuiState::new` / `LiveTableConfig` and use it to pre-seed each row's `received_patches` in `LiveTable::new`. Prune and sync pass `!streaming_fields` (everything the seed authoritatively populated that the stream won't update). List passes `EMPTY` (the streaming collector requests `ALL`). Clone also passes `EMPTY` (seeded with empty stubs). `daft list` was unaffected because its streaming collector requests `FieldSet::ALL`, which fires a `P::Owner(None)` patch for the default branch that flips the bit. Regression test: `seeded_fields_marks_cells_received_at_construction` in `live_table::tests` (paired with `seeded_fields_empty_preserves_existing_loading_behavior`). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The bitmask represents "fields not arriving via the streaming collector" rather than "fields the synchronous seed populated". It works because the render path keys shimmer off `vals.X.is_empty()` rather than the bit alone — empty cells with the bit set render as "final empty" rather than shimmering — but the comment should match reality. Also acknowledges in the live_table.rs `push_row` doc that the `FieldSet::EMPTY` default for dynamically-discovered branches is a conservative choice, not provably-correct for all callers: cells that no patch ever lands on (e.g. gone branches surfaced after fetch in prune) will shimmer indefinitely. That's a pre-existing condition; fix is out of scope here. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The auto-generated header comment in mise.lock was pointing at the old mise.jdx.dev domain. Refresh to mise.en.dev to match the current upstream URL. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The loading skeleton previously breathed across xterm grayscale indices 234-253 (~11%-85% luminance), a 74-point swing that read as harsh on dark-themed terminals. Narrow to indices 239-252 (~30%-80%, ~50-point swing) for a softer pulse that stays clearly visible without strobing. Triangle-wave shape and 16-frame breath period are unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This was referenced May 1, 2026
Merged
Merged
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.
Summary
daft pruneanddaft sync. Root cause:resolve_owner_with_fallbacksreturnsNonefor the default branch by design, but the loading-state machinery never markedOWNERas received because prune/sync'sstreaming_fieldsnever includes it (and with default flags no streaming collector even runs, soWorktreeInfoCollectionDonenever fires).seeded_fields: FieldSetplumbed throughTableConfig→TuiState::new→LiveTableConfig→LiveTable::new, where each row'sreceived_patchesis now initialized toseeded_fieldsinstead ofFieldSet::EMPTY. This pre-marks bits whose authoritative value is known before TUI start (synchronously seeded, or guaranteed not to arrive via the stream).prune.rs/sync.rspass!streaming_fields;list_live.rs/clone.rspassFieldSet::EMPTY.Test plan
mise run fmtcleanmise run clippyzero warningsmise run test:unit(1495 passing) — includes new regression tests inlive_table.rs::tests:seeded_fields_marks_cells_received_at_construction(the fix's red-then-green TDD test)seeded_fields_empty_preserves_existing_loading_behavior(paired negative guard)daft pruneanddaft syncin a sandbox repo with the default branch present — confirm the owner cell on the main row renders blank (no shimmer) for the duration of the operation🤖 Generated with Claude Code