Skip to content

Make conversation threads visually obvious in the home feed - #268

Open
wlplease wants to merge 4 commits into
QuilibriumNetwork:masterfrom
wlplease:feature/quorum-conversation-thread-clarity
Open

Make conversation threads visually obvious in the home feed#268
wlplease wants to merge 4 commits into
QuilibriumNetwork:masterfrom
wlplease:feature/quorum-conversation-thread-clarity

Conversation

@wlplease

@wlplease wlplease commented Aug 22, 2026

Copy link
Copy Markdown

Summary

Makes conversation relationships understandable at a glance in Quorum's chrono/reply-bumping home feed without changing cast navigation or feed ordering.

  • keeps every visible cast author's PFP present
  • draws a clear parent-to-reply connector between adjacent replies
  • collapses deep conversations to at most three casts per feed unit
  • preserves the bumped cast as the feed row identity
  • keeps quoted replies ancestry-blind so they render like ordinary quote casts
  • provides stable loading/unavailable parent context instead of layout jumps
  • adds accessibility labels for reply relationships and omitted context
  • bounds context resolution to parent and grandparent lookups

Deep-thread behavior

For a resolved deep chain, the preview selects the root/oldest resolved context, an omission marker when needed, the immediate parent, and the focused reply while never rendering more than three casts.

One product decision remains for deep cross-author chains whose absolute root is not already resolved:

  • Current behavior: show the oldest context resolved on-device, explicitly mark unknown earlier context, then show the immediate parent/current reply.
  • Alternative: always fetch and place the absolute thread root first.

The current behavior keeps home-feed fetching bounded and prioritizes the relationship immediately relevant to the focused reply. Maintainer guidance is requested before finalizing this policy.

Navigation and quote casts

Existing tap targets are preserved through an explicit target-selection helper. Quote cards do not receive parent context, connectors, omission markers, or ancestry fetches.

Validation

  • 15 focused assertions cover the thread-preview policy
  • 24/24 relevant assertions pass across thread preview, quote isolation, avatar fallback, and bounded thread-detail fetching
  • changed-code ESLint: 0 errors (21 pre-existing warnings in SocialFeedModal.tsx)
  • diff whitespace check: clean
  • TypeScript attribution: 0 errors in changed files; 12 existing errors remain elsewhere in the repository baseline
  • Android debug APK built and launched successfully
  • no fatal Android runtime errors observed
  • the combined Jest run uses --forceExit because the existing thread-detail suite leaves an open handle

Coverage includes depths 1-64 in known- and unknown-root modes, simultaneous leading/internal omissions, case-insensitive hashes, input immutability, self-reply chains, branches, cycles, unrelated conversations, bumped ordering, stable row identity, navigation targets, and quote isolation.

Remaining visual validation

Authenticated production-feed screenshots and iOS device validation are still required. The Android test account could reach the social feed, but Quorum correctly requires an imported Farcaster account before rendering real casts.

@wlplease

Copy link
Copy Markdown
Author

Visual QA / screenshot matrix

Real authenticated captures are still pending. Please capture the same examples on Android and iOS at the default text size, then repeat the deep-thread case at the largest supported text size.

  • Original cast — PFP and normal feed spacing remain unchanged
  • Direct cross-author reply — both PFPs visible; connector clearly terminates at the replying avatar
  • Three-cast conversation — every PFP visible; continuous rails only imply direct adjacency
  • Deep known-root reply — root + omission marker + immediate parent/current; no more than three casts
  • Deep unresolved-root reply — leading unknown-context marker plus internal omission when both are present
  • Branched conversation — branches remain separate feed units with unique row identity
  • Quote cast of a reply — quoted card shows only the quoted cast and its PFP; no ancestry rail/context
  • Parent loading state — stable avatar slot and relationship row; no layout jump
  • Parent unavailable state — stable fallback row and no broken connector
  • Image-skinned cast — connector remains visible above the background treatment
  • Largest text size — labels wrap without covering avatars, rails, or actions
  • VoiceOver/TalkBack — announces reply relationship and omitted context without reading decorative rails

For the PR evidence, use one tightly cropped before/after pair for direct replies and one pair for deep replies. Add a separate quote-cast capture to prove ancestry isolation. Do not include recovery phrases, private keys, notifications, DMs, or unrelated account information.

@wlplease

Copy link
Copy Markdown
Author

Correction: tagging the repository account associated with the existing thread implementation — @CassOnMars.

For deep cross-author chains whose absolute root is not already resolved on-device, should the feed show the oldest resolved context + immediate parent/current reply (the current bounded-fetch behavior), or must the first visible cast always be the absolute thread root?

The current implementation explicitly marks unknown earlier context and never renders more than three casts per feed unit. I will align the final policy with your preference.

@wlplease
wlplease marked this pull request as ready for review August 22, 2026 04:30
@wlplease

Copy link
Copy Markdown
Author

Additional cross-platform verification

Completed after the visual QA checklist:

  • ✅ Android production Hermes export: 12,087 modules, 26.0 MB
  • ✅ iOS production Hermes export: 12,089 modules, 26.0 MB
  • ✅ Android dev-client runtime: current branch bundled and launched without fatal Android/JS crash signatures
  • ✅ Android font scale 2.0: unauthenticated social-feed boundary remains fully visible and wraps without clipping
  • ✅ TalkBack service active: app remains stable; reply relationship and omitted-context labels are implemented as semantic accessibility labels
  • ✅ Focused thread regression suite: 15/15 passing
  • ✅ PR diff whitespace check clean

Still requires account/device access before those checklist items can be marked complete:

  • Authenticated Farcaster feed captures for real direct/deep/branched/quote conversations
  • Native iOS rendering plus VoiceOver on macOS/iPhone
  • Maintainer decision on absolute-root policy (question above)

No credentials or private account data were used in this verification.

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