Skip to content

fix(web): prioritize linked pull requests over automatic diffs - #12142

Merged
maria-rcks merged 3 commits into
pingdotgg:mainfrom
maria-rcks:fix/proactive-pr-priority
Sep 16, 2026
Merged

maria-rcks merged 3 commits into
pingdotgg:mainfrom
maria-rcks:fix/proactive-pr-priority

Conversation

@maria-rcks

@maria-rcks maria-rcks commented Sep 16, 2026

Copy link
Copy Markdown
Collaborator

Linked pull requests could be missed while thread history loaded, and the multi-PR tab was not protected from automatic diffs. Open linked PRs from thread metadata immediately, using the existing PRs tab for multiple or foreign-repository links, and give them priority over completed-turn diffs.

Without a linked PR, only open a diff automatically for at least 3 changed files or 50 added/deleted lines. Preserve manual tab choices, the proactive-panels setting, and narrow-screen behavior.

Validation: 216 focused tests pass; web typecheck and scoped lint pass (existing warnings). Real-client checks confirmed single-PR opening before history finishes loading and immediate PRs-tab selection when a second real PR is linked. Read-only Codex turns preserved PR priority and later manual tab choices. At 390px, the sheet stayed closed automatically and opened manually from the PR badge. A single foreign link also selected the PRs tab with an independently discovered branch PR present.

linking a second real pr immediately opens the prs tab

before: proactive panel settings

after: pr priority and the automatic diff threshold

Implemented with GPT-6 in Codex.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 16, 2026
macroscopeapp[bot]
macroscopeapp Bot previously approved these changes Sep 16, 2026
@macroscopeapp

macroscopeapp Bot commented Sep 16, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 936b397

Macroscope's review found this PR approvable — This is a focused fix to existing web panel prioritization and automatic diff thresholds, with targeted tests and no schema, security, infrastructure, or default-setting changes. The runtime impact is limited to selecting already-supported pull-request or diff panels while preserving manual choices.

You can add or adjust custom eligibility rules. Learn more.

@macroscopeapp
macroscopeapp Bot dismissed their stale review September 16, 2026 21:24

Dismissing prior approval to re-evaluate d2af9d6

@coderabbitai

coderabbitai Bot commented Sep 16, 2026

Copy link
Copy Markdown

Review Change StackReview Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: bc9aeedd-4ae0-4aab-a41e-55a73413bd82

📥 Commits

Reviewing files that changed from the base of the PR and between 32e8b25 and 936b397.

📒 Files selected for processing (6)
  • apps/web/src/components/ChatView.logic.test.ts
  • apps/web/src/components/ChatView.logic.ts
  • apps/web/src/components/ChatView.tsx
  • apps/web/src/components/settings/SettingsPanels.tsx
  • apps/web/src/rightPanelStore.test.ts
  • apps/web/src/rightPanelStore.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 4 remain after this review.


📝 Walkthrough

Walkthrough

Changes

Proactive panel behavior

Layer / File(s) Summary
Diff opening thresholds
apps/web/src/components/ChatView.logic.ts, apps/web/src/components/ChatView.logic.test.ts, apps/web/src/components/settings/SettingsPanels.tsx
Completed-turn diffs now open only for at least 3 changed files or 50 changed lines. Tests cover threshold cases, and the setting description states these conditions.
Pull-request surface arbitration
apps/web/src/rightPanelStore.ts, apps/web/src/rightPanelStore.test.ts
The right-panel store accepts the pull-request list surface and prevents proactive diffs from replacing either pull-request surface.
ChatView proactive routing
apps/web/src/components/ChatView.tsx
ChatView selects between the linked pull-request and pull-request list surfaces using visible PR data, capability state, and linked detail availability. It also defers unresolved states and suppresses competing completion panels.

Priority: ⬇️ Low

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Bug fix

Sequence Diagram(s)

sequenceDiagram
  participant ChatView
  participant RightPanelStore
  participant PullRequestsSurface
  participant DiffSurface
  ChatView->>RightPanelStore: evaluate visible pull requests and diff eligibility
  RightPanelStore->>PullRequestsSurface: open linked or list pull-request surface
  ChatView->>DiffSurface: open qualifying completed-turn diff
Loading

Suggested reviewers: t3dotgg

Merge Risk: ⚪ Minimal · up to 936b3

Foreign linked pull requests are routed to the pull-request list as intended. No actionable merge-blocking risk remains.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 4 functions across 6 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly summarizes the primary change: prioritizing linked pull requests over automatic diffs.
Description check ✅ Passed The description explains what changed, why it changed, affected UI behavior, validation results, and includes screenshots and a video. It does not use the template headings or include the checklist, b…
  • Fix all pre-merge checks with AI
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@maria-rcks
maria-rcks merged commit 52ad70e into pingdotgg:main Sep 16, 2026
23 checks passed
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 17, 2026
## What's Changed
* feat(usage): show OpenCode Go, Cursor, and Grok subscription limits by @maria-rcks in pingdotgg/t3code#12115
* fix(web): dropped folders become path chips on the local environment and are refused on remote ones by @SunkenInTime in pingdotgg/t3code#12001
* fix(web): adapt provider settings to available content width by @tris203 in pingdotgg/t3code#12138
* fix(web): show private repository media in pull request tabs by @maria-rcks in pingdotgg/t3code#11706
* fix(review): show complete counts and load large diffs progressively by @tris203 in pingdotgg/t3code#10822
* fix(web): prioritize linked pull requests over automatic diffs by @maria-rcks in pingdotgg/t3code#12142
* feat(cli): show installer and update download progress by @juliusmarminge in pingdotgg/t3code#12044
* fix(web): simplify agent approval prompts by @Bil0000 in pingdotgg/t3code#12082
* fix(web): show tooltips for composer environment and workspace controls by @flamboh in pingdotgg/t3code#11787
* fix(chat): group thoughts into the changing tool activity line by @maria-rcks in pingdotgg/t3code#12147
* fix(web): keep tool timestamps before disclosure chevrons by @Yash-Singh1 in pingdotgg/t3code#12152
* fix(web): default diff panel to working tree by @maria-rcks in pingdotgg/t3code#12139
* design(mobile): unify Android Material layouts and native controls by @PixPMusic in pingdotgg/t3code#11841
* feat(web): choose themes from chat with color previews by @maria-rcks in pingdotgg/t3code#12143
* fix(web): align follow-up and license settings controls by @Bil0000 in pingdotgg/t3code#12167
* fix(web): align composer task rows by @maria-rcks in pingdotgg/t3code#12165
* fix(mobile): prevent Android compose FAB animation jitter by @PixPMusic in pingdotgg/t3code#12169
* fix(server): keep large sparse checkouts on the fast checkpoint path by @vedprakash2302 in pingdotgg/t3code#12154
* feat(web): make pull request comments easier to scan by @maria-rcks in pingdotgg/t3code#12150
* fix(server): propagate linked pr changes and settle threads immediately by @maria-rcks in pingdotgg/t3code#12161
* fix(web): reuse cached GitHub PR details across entry points by @maria-rcks in pingdotgg/t3code#12168
* Remove `new` badge from Fable 5.1 by @juliusmarminge in pingdotgg/t3code#12173
* fix(web): show author avatars in pull request previews by @extoci in pingdotgg/t3code#12125

## New Contributors
* @vedprakash2302 made their first contribution in pingdotgg/t3code#12154

**Full Changelog**: pingdotgg/t3code@v0.0.43-nightly.20260916.1825...v0.0.43-nightly.20260917.1837

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.43-nightly.20260917.1837
aorwall added a commit to aorwall/t3code that referenced this pull request Sep 18, 2026
Merges `pingdotgg/t3code` `6d1d549441` into the fork, from base
`0bf2d6b010` — 50 commits.

- **Landed:** 410 files against 407 in the upstream range; the gap of 3
is `docs/fork/gaps.md`, `inventory.json` and `upstream-merge-log.md`.
Everything in the range landed.
- **Fork delta:** 777 files.
- **Verification:** all 9 `verify.mjs` checks pass, tests green in all
15 packages.
- **Unsupported methods:** ADD 0, DROP 0 —
`packages/contracts/src/rpc.ts` and `auth.ts` are untouched. Upstream
added no WebSocket method in this range.

## The one that mattered

Upstream's pingdotgg#12015 moved the **entire body of the thread route** out of
`apps/web/src/routes/_chat.$environmentId.$threadId.tsx` and into a new
upstream file, `apps/web/src/components/ThreadRouteView.tsx`, rendered
by the `_chat` layout so a draft's promotion keeps the same `ChatView`
mounted. The route file is now a seven-line stub.

Three fork deltas lived in that file. They moved with it:
`useAdoptedThread`, `useAutoFollowThread` and the
`serverThreadAwaitingFirstAnswer` argument to
`resolveThreadRouteRenderState`, all reading `target.kind === "server" ?
target.threadRef : null` — a draft's reserved ref is the viewer's own
work and the listing carries it without being asked. The
`unlisted-thread-adoption` and `thread-follow` inventory entries were
re-pointed at the new file.

The fork's own delta guard is what caught this. The merge was clean and
typecheck was green; `features.test.ts` failed because
`useAutoFollowThread` was no longer in a file the inventory said it had
to be in.

## Conflicts

8 files, each resolved with the verdict `preflight.mjs` printed. Details
in the tracker entry; the short form:

| file | verdict | resolution |
| --- | --- | --- |
| `routes/_chat.$environmentId.$threadId.tsx` | unlisted | took
upstream's stub, deltas relocated (above) |
| `chat/MessagesTimeline.tsx` | `message-origin-upstream-files` | both
sides of `TimelineRowActivityState`, its memo and its deps merged;
dropped upstream's now-unused `GitPullRequestIcon` |
| `ThreadStatusIndicators.tsx` | `thread-status-indicators` | fork's
memo above upstream's early return — hooks before any conditional
`return null` |
| `settings/ProviderInstanceCard.tsx` | unlisted, in
`moatless-provider-auth` | kept the `FEATURES.providerConfiguration`
ternary, took upstream's container-query classNames inside it |
| `settings/SettingsPanels.tsx` | `settings-surface-gates` | re-stated
the fork's browser clause onto upstream's rewritten `proactive-panels`
text |
| `BranchToolbar.tsx` | `branch-toolbar-gates` | import block, both
sides kept |
| `RightPanelTabs.tsx` | `right-panel-surfaces` | import block, both
sides kept |
| `pnpm-lock.yaml` | `theirs — lockfile` | `--theirs` then `vp i`,
re-derived lockfile committed |

## Path policy closed a hole

`resolution-check` listed eight unlisted paths both sides changed;
**seven carried a real fork delta**, so next merge's `theirs` fallback
would have dropped them silently. All seven are now listed — five new
entries (`command-palette-gates`, `diff-panel-gates`,
`provider-settings-gates`, `chat-layout-route`,
`client-runtime-exports`) plus `rightPanelStore.test.ts` added to
`right-panel-surfaces`. The eighth is the thread route stub, which
resolved to upstream byte for byte.

## Usable as-is

Client work that runs against the Moatless backend today:

- **pingdotgg#12015** worktree setup card no longer flashes or shifts (the
relocation above) · **pingdotgg#12144** thread reading positions are preserved ·
**pingdotgg#12162** header spacing stays stable when the sidebar drawer opens
- **pingdotgg#8641** timestamps on tool rows and turn folds · **pingdotgg#12152** those
timestamps sit before the disclosure chevron · **pingdotgg#12147** thoughts group
into the changing tool activity line
- **pingdotgg#12075** send-shortcut and follow-up controls · **pingdotgg#12160** rich text
composer on by default · **pingdotgg#12165** composer task rows aligned ·
**pingdotgg#11787** tooltips on the composer's environment and workspace controls
· **pingdotgg#12082** simpler agent approval prompts
- **pingdotgg#12139** diff panel defaults to the working tree · **pingdotgg#12190** diff
files collapse by default · **pingdotgg#12142** a linked pull request wins over
an automatic diff
- **pingdotgg#12143** themes picked from chat with colour previews · **pingdotgg#12138**
provider settings adapt to content width · **pingdotgg#12167** follow-up and
license controls aligned
- **pingdotgg#12026** unsupported environments render as neutral rows with their
machine icon · **pingdotgg#12030** a discovered machine's icon survives a relay
refresh · **pingdotgg#12001** dropped folders become path chips locally and are
refused on remote environments
- **pingdotgg#11144** pull-request icon state centralised — a refactor the fork's
own badge filtering now rides

Not fork surfaces, landed for completeness: the mobile work (pingdotgg#11841,
pingdotgg#12169, pingdotgg#12177, version bump), the CLI installer progress bar (pingdotgg#12044),
docs (pingdotgg#11696), release chores and the Fable 5.1 badge (pingdotgg#12173).

## Unsupported in Moatless / needs implementation

- **Pull request surface** — `FEATURES.pullRequestSurface` is off, so
none of this merge's pull-request work is reachable: **pingdotgg#11994** (submit
PR comments with Cmd/Ctrl+Enter), **pingdotgg#12150** (comments easier to scan,
`apps/web/src/components/pullRequest/**` plus a `pullRequest.ts`
contract field), **pingdotgg#12168** (cached GitHub PR details reused across
entry points), **pingdotgg#12125** and **pingdotgg#11728** (author avatars and their
fallback). **pingdotgg#11706** needs backend work on top: private-repository
media in PR tabs goes through a new `packages/contracts/src/assets.ts`
proxy that Moatless would have to serve. Opening the surface means
deleting the `pullRequestSurface` entry and its gates, and dispatching
`pullRequests.list` / `.detail` / `.activity` — only
`pullRequests.summary` is served today.
- **Keybindings settings page** — **pingdotgg#12175** turns every keybinding
command into a searchable settings row pointing at
`/settings/keybindings`, which `FEATURES.serverAdministration` keeps out
of the sidebar and redirects on a typed URL. The rows still match in
settings search and land on that redirect. Left as-is this merge — it is
the same shape as the six `snap-shot-*` rows that have always done this,
and the one-line fix (a `settingsPathEnabled(item.to)` filter in
`filterAvailableSettingsSearchItems`) is a behaviour change that belongs
outside a merge. Recorded in `gaps.md`. Closes properly when
`server.upsertKeybinding` / `removeKeybinding` are dispatched.
- **Device hub** — **pingdotgg#12017** (detect unsupported legacy Android
command-line tools) and **pingdotgg#12033** (resolve Node for standalone helper
scripts) are both `apps/server/src/device/**`. `FEATURES.deviceHub` is
off and Moatless runs no device host at all, so there is nothing to do
and nothing to reproduce.

## Backend behavior to consider reproducing in Moatless

All recorded in `docs/fork/gaps.md`; nothing in this repository holds
them open.

Checkpoint and turn path, under _Runtime fixes upstream made to its own
server_:

- **pingdotgg#12154** keep large sparse checkouts on the fast checkpoint path —
streams `git ls-files --full-name --sparse -z -v` under a 4 KiB cap and
pins `sparse.expectFilesOutsideOfPatterns=false`. Without it a sparse
checkout large enough to blow the output limit drops to the slow path on
every checkpoint.
- **pingdotgg#10944** flush checkpoint objects and refs before publishing them —
otherwise a reader that acts on the announcement can find a ref pointing
at an object that is not there yet. Rare, unreproducible, permanent when
it lands.
- **pingdotgg#8432** keep a ready checkpoint when a later placeholder arrives
(`ProjectionPipeline.ts`) — the symptom is a checkpoint reverting to
pending and never coming back.
- **pingdotgg#11970** keep VCS waits from blocking turn completion
(`ProviderRuntimeIngestion.ts`, `decider.ts`) — a slow git call between
the provider's last event and the turn being marked done. Slower in a
sandbox than upstream.

Settlement, under _Settlement rules Moatless owns_:

- **pingdotgg#12161** settle on the `thread.pull-request-linked` / `-synced`
event with a per-thread sweep rather than waiting for the next periodic
one.
- **pingdotgg#12176** make the cancellation path uninterruptible around
record-and-rollback, so a cancelled worktree setup records its
settlement instead of being left mid-setup.

Client features that are inert until the backend emits or honours
something:

- **pingdotgg#11784** provider thinking traces — `orchestration` gained a
`reasoning` message role and `thread.message.reasoning.delta` /
`.complete` commands behind a `reasoningMessages: true` opt-in on
subscribe. The client renders them when they arrive; Moatless emits
none, so there are no traces.
- **pingdotgg#10822** complete counts and progressive large diffs —
`review.getDiffPreview` gained an optional `file` input (one file's
patch) and an optional `files` stat array ("absent on older servers").
Moatless dispatches the method and honours neither, so large diffs stay
truncated with incomplete counts.
- **pingdotgg#11519** native provider slash commands, exposed server-side and
consumed by the mobile client.
- **pingdotgg#12115** OpenCode Go, Cursor and Grok subscription limits in the
usage scan.

## Verification

`tripwires`, `duplicate-adds`, `resolution-check`, `inventory-check`,
`unsupported-methods`, `lockfile`, `fmt:check`, `lint` and `typecheck`
all pass; tests pass in all 15 packages. Two failures were found and
fixed on the way:

- `TS2552: Cannot find name 'label'` in `ThreadStatusIndicators.tsx` —
pingdotgg#11104/pingdotgg#11180 hoisted `label` onto the presentation object and the
fork's multi-link popover branch still read the removed local.
- The delta-guard test failure described above.

Two operational notes for the next run are in the tracker entry: `vp i`
needs `NODE_OPTIONS=--max-old-space-size=6144` in this sandbox, and
`--force-with-lease` needs the explicit `<ref>:<sha>` form with the SHA
read from `git ls-remote`, because this clone only fetches `main` and
the branch has no lease-eligible tracking ref.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---
Moatless task:
https://moatless.soaplabstest.com/tasks/e3e17736-1c3d-4873-b9af-c434fd31b003
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M 30-99 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant