sync(upstream): merge upstream/main 5661c6116 into fork/dev - #379
Open
omegent-app[bot] wants to merge 5 commits into
Open
sync(upstream): merge upstream/main 5661c6116 into fork/dev#379omegent-app[bot] wants to merge 5 commits into
omegent-app[bot] wants to merge 5 commits into
Conversation
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
Bot
force-pushed
the
sync/upstream-6d70e6d77
branch
from
August 7, 2026 14:28
0a7394f to
b962e2b
Compare
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.
Adopts upstream through
5661c6116— the three commits after #378, as two merge commits(
#5372landed first;#5581arrived 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.
5661c61166d70e6d77be1a83674What 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 deletesWorkspaceConnectionStatus.tsx, so a reconnect no longer shifts rows. The fork rendered that statusin four places across
HomeScreenandThreadNavigationSidebar— exactly the row-shifting beingfixed — so those in-list surfaces are removed and the header slots adopted.
The auto-merge left a dangling
{connectionStatus}inHomeScreenwhose definition upstream haddeleted; typecheck caught it.
Fork surfaces kept around the new title:
HomeScreenkeeps itsselectedEnvironmentIdslabel derivationand
environmentLabelById(BoardScreen consumes it) instead of upstream's singleselectedEnvironmentId;search bar, with upstream's connection-aware options merged into the same header object (spread
first, so board's transparency overrides still win);
HomeRouteScreenkeeps the fork's in-flowHomeHeaderas title owner rather than alsorestoring 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:
IosHomeHeaderowning the native title, so dropping upstream's route-level options left no connection-status surface at all on that pathIosHomeHeadernow spreads the connection-aware optionsgetConnectionAwareBrandHeaderOptionshardcodes the brand lockup and the literal"Threads", so spreading it over the fork's list-mode titles silently renamed Board and Projectstitle/brand; every adopting surface passes its mode titlegetConnectionAwareBrandHeaderOptionsimport left inHomeRouteScreenRound 2 re-verified the fixes and caught a surface I had missed:
"Threads"brandTitleOffsetwas applied to caller-supplied titles that lack the brand lockup's internal inset, sliding the status sideways during the swapmobileSurfaceExistencenow 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 treeFinal 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
pinOrderKeyon every platform, deliberatelyindependent 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
threadPinReordercapability gates dragging only,never the sort.
SidebarV2keeps the fork's environment/ownership filters around the new pinnedblock and gains
reorderablePinnedKeys.Welds the auto-merge produced, every one caught by typecheck or tests:
useThreadActions.tsThreadPinReorderUnsupportedErrorlanded inside the fork'sclearPerThreadClientState, leaving it unclosedthreadListV2.tsfor (const thread of …)headers stacked on one loop bodyuseThreadListActions.tsthreadEnvironmentimport plus local copies of helpers this fork imports fromthreadActionMessagesHomeRouteScreenonEnvironmentChangehandler, which this multi-select screen has no prop forprojector.pinned.test.tsstate.threads[0]; this fork's read model keys threads by id in an EffectHashMap038 ProjectionThreadsPinOrderKeyextends itReview of the second merge: both reviewers cleared pin-sort/capability separation, fork
behaviour, welds, ledger windows and test integrity. Two follow-ups:
repair that wrote
038without applying theALTER TABLEwould still pass. Fixed: the repairscenario now asserts
pin_order_keyexists.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
CodexTextGenerationlaunch-args one,which reproduces on unmerged
fork/dev.Co-authored by @patroza
opened by Patrick Roza in chat thread Discord · Discord · T3