Skip to content

sync(upstream): merge upstream/main 5661c6116 into fork/dev - #379

Open
omegent-app[bot] wants to merge 5 commits into
fork/devfrom
sync/upstream-6d70e6d77
Open

sync(upstream): merge upstream/main 5661c6116 into fork/dev#379
omegent-app[bot] wants to merge 5 commits into
fork/devfrom
sync/upstream-6d70e6d77

Conversation

@omegent-app

@omegent-app omegent-app Bot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 5661c6116 — the three commits after #378, as two merge commits
(#5372 landed first; #5581 arrived while this PR was in review and is folded in here).

Important

Merge with a merge commit, not squash. Squashing collapses the second parent and discards
upstream's commits as ancestors — the thing that keeps "commits behind upstream" honest.

Commit
5661c6116 feat(web): drag pinned threads into your own order (pingdotgg#5581)
6d70e6d77 fix(mobile): reconnects no longer shift the thread list (pingdotgg#5372)
be1a83674 chore(release): prepare v0.0.32

What pingdotgg#5372 does, and why it collided

Upstream moves mobile connection status out of the lists into the header title slot (new
WorkspaceConnectionTitle / getConnectionAwareBrandHeaderOptions) and deletes
WorkspaceConnectionStatus.tsx, so a reconnect no longer shifts rows. The fork rendered that status
in four places across HomeScreen and ThreadNavigationSidebar — exactly the row-shifting being
fixed — so those in-list surfaces are removed and the header slots adopted.

The auto-merge left a dangling {connectionStatus} in HomeScreen whose definition upstream had
deleted; typecheck caught it.

Fork surfaces kept around the new title:

  • multi-environment selectionHomeScreen keeps its selectedEnvironmentIds label derivation
    and environmentLabelById (BoardScreen consumes it) instead of upstream's single
    selectedEnvironmentId;
  • board mode — the sidebar keeps its board branch, board-specific solid header and board-gated
    search bar, with upstream's connection-aware options merged into the same header object (spread
    first, so board's transparency overrides still win);
  • HomeRouteScreen keeps the fork's in-flow HomeHeader as title owner rather than also
    restoring upstream's native-stack title.

Adversarial review — two rounds, and it earned its keep

Round 1 (grok-4.5 + gpt-5.6-sol, independently) found two real defects in my first pass:

Finding Disposition
HIGH (both) — iOS Home has its own IosHomeHeader owning the native title, so dropping upstream's route-level options left no connection-status surface at all on that path Fixed. IosHomeHeader now spreads the connection-aware options
MED (grok)getConnectionAwareBrandHeaderOptions hardcodes the brand lockup and the literal "Threads", so spreading it over the fork's list-mode titles silently renamed Board and Projects Fixed. The helper takes an optional title/brand; every adopting surface passes its mode title
LOW (both) — dead getConnectionAwareBrandHeaderOptions import left in HomeRouteScreen Fixed. Removed

Round 2 re-verified the fixes and caught a surface I had missed:

Finding Disposition
MED (both) — the custom (Android split) sidebar large title still hardcoded "Threads" Fixed. Now mode-aware
LOW (codex)brandTitleOffset was applied to caller-supplied titles that lack the brand lockup's internal inset, sliding the status sideways during the swap Fixed. The offset now applies only to the default brand
LOW (grok) — 17px vs 18px title metrics on the new iOS brand text Fixed. Aligned to 18
(codex) — no test covered mode-title preservation, "which allowed the custom-sidebar defect through" Fixed. mobileSurfaceExistence now asserts every adopting surface passes its own list-mode title and that no surface re-renders the deleted in-list pill. Verified to fail on the pre-fix tree

Final coverage, confirmed by both reviewers: status is reachable on Android in-flow home, iOS home,
sidebar native, sidebar custom, board mode and split view — exactly once on each, with mode
titles surviving everywhere.

pingdotgg#5581 — drag pinned threads (second merge)

Pinned rows now sort by the user's arranged pinOrderKey on every platform, deliberately
independent of the fork's thread-grouping preference: that preference still orders the active
rows, but a pin is an explicit arrangement, and upstream documents the sort as identical everywhere
so mixed-version fleets cannot disagree. The threadPinReorder capability gates dragging only,
never the sort. SidebarV2 keeps the fork's environment/ownership filters around the new pinned
block and gains reorderablePinnedKeys.

Welds the auto-merge produced, every one caught by typecheck or tests:

Where Weld
useThreadActions.ts upstream's ThreadPinReorderUnsupportedError landed inside the fork's clearPerThreadClientState, leaving it unclosed
threadListV2.ts two for (const thread of …) headers stacked on one loop body
useThreadListActions.ts duplicate threadEnvironment import plus local copies of helpers this fork imports from threadActionMessages
HomeRouteScreen upstream's single-environment onEnvironmentChange handler, which this multi-select screen has no prop for
projector.pinned.test.ts indexed state.threads[0]; this fork's read model keys threads by id in an Effect HashMap
six migration fixtures pinned the ledger tail at 37; upstream's 038 ProjectionThreadsPinOrderKey extends it

Review of the second merge: both reviewers cleared pin-sort/capability separation, fork
behaviour, welds, ledger windows and test integrity. Two follow-ups:

  • grok LOW — the ledger fixtures asserted the new migration's row but not its effect, so a
    repair that wrote 038 without applying the ALTER TABLE would still pass. Fixed: the repair
    scenario now asserts pin_order_key exists.
  • codex MED — mobile computes Move Up/Down neighbours from all reorder-capable shells while
    rendering pins after env/project/search/snooze filtering, so a hidden pin can become the actual
    neighbour. Grok examined the same behaviour and filed it as upstream's own design (mobile
    "all shells" move vs web visible-list drag), not a merge weld — the fork's filters just make it
    more visible. Left as upstream ships it; changing it here would be a product decision beyond
    the sync. Worth a follow-up PR if you want mobile to match web.

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,284 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

t3-code Bot and others added 5 commits August 7, 2026 11:50
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Adopts the two upstream commits after #378: reconnects no longer shift the
mobile thread list (pingdotgg#5372) and the v0.0.32 release prep.

pingdotgg#5372 moves connection status out of the lists into the header title slot
(WorkspaceConnectionTitle / getConnectionAwareBrandHeaderOptions) and deletes
WorkspaceConnectionStatus. The fork rendered that status in four places across
HomeScreen and ThreadNavigationSidebar — exactly the row-shifting this fixes —
so those in-list surfaces are removed and the header slots adopted. The
auto-merge left one dangling {connectionStatus} in HomeScreen whose definition
upstream had deleted; typecheck caught it.

Fork surfaces kept around the new title:
- multi-environment selection: HomeScreen keeps its selectedEnvironmentIds
  label derivation and environmentLabelById (BoardScreen consumes it) instead
  of upstream's single selectedEnvironmentId.
- board mode: ThreadNavigationSidebar keeps its board branch, board-specific
  solid header, and board-gated search bar, with upstream's connection-aware
  brand slot merged into the same header options.
- HomeRouteScreen keeps the fork's in-flow HomeHeader as title owner rather
  than also restoring upstream's native-stack title, which would surface the
  connection status twice.

Adversarial review caught two holes in the first pass, both fixed here:
getConnectionAwareBrandHeaderOptions hardcodes the brand lockup and "Threads",
so spreading it over the fork's list-mode titles silently replaced "Board" /
"Projects"; and iOS Home has its own IosHomeHeader owning the native title, so
dropping upstream's route-level options left that path with no status surface
at all. The helper now takes an optional title/brand, and both the sidebar and
IosHomeHeader pass their mode title through it.

A second review pass caught one more surface — the custom (Android split)
sidebar large title still hardcoded "Threads" — plus the status offset being
applied to caller-supplied titles that lack the brand lockup's inset. Both
fixed, and mobileSurfaceExistence now asserts every adopting surface passes its
own list-mode title (that assertion fails on the pre-fix tree).

Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Adopts pingdotgg#5581 (drag pinned threads into your own order) on top of the pingdotgg#5372
merge already on this branch.

Pinned rows now sort by the user's arranged pinOrderKey on every platform,
which is deliberately independent of the fork's thread-grouping preference:
that preference still orders the active rows, but a pin is an explicit
arrangement and upstream documents the sort as identical everywhere so
mixed-version fleets cannot disagree. Server capability gates dragging only,
never the sort. SidebarV2 keeps the fork's environment/ownership filters around
the new pinned block and gains upstream's reorderablePinnedKeys.

Welds the auto-merge produced, all caught by typecheck or tests:
- useThreadActions.ts: upstream's ThreadPinReorderUnsupportedError landed
  inside the fork's clearPerThreadClientState, leaving it unclosed.
- threadListV2.ts: two `for (const thread of ...)` headers stacked on one
  loop body; the pinned block takes upstream's order-key sort.
- useThreadListActions.ts: duplicate threadEnvironment import plus local
  copies of helpers this fork imports from threadActionMessages.
- HomeRouteScreen: upstream's single-environment onEnvironmentChange handler
  does not exist in this fork's multi-select screen.
- projector.pinned.test.ts indexed state.threads[0]; this fork's read model
  keys threads by id in a HashMap.
- Six migration-ledger fixtures pinned the tail at 37; upstream's 038
  ProjectionThreadsPinOrderKey extends it.

Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-app Bot force-pushed the sync/upstream-6d70e6d77 branch from 0a7394f to b962e2b Compare August 7, 2026 14:28
@omegent-app omegent-app Bot changed the title sync(upstream): merge upstream/main 6d70e6d77 into fork/dev sync(upstream): merge upstream/main 5661c6116 into fork/dev Aug 7, 2026
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