Skip to content

fix(server): sync pull request draft status changes - #22832

Merged
Yash-Singh1 merged 2 commits into
mainfrom
t3/sync-pr-draft-sidebar-status
Oct 21, 2026
Merged

Yash-Singh1 merged 2 commits into
mainfrom
t3/sync-pr-draft-sidebar-status

Conversation

@Yash-Singh1

Copy link
Copy Markdown
Collaborator

Problem

The sidebar can keep showing a pull request as a draft after it becomes ready. Its saved status only refreshed when the PR changed between open, closed, or merged, so changes to isDraft were missed.

Change

Track draft status alongside the PR state when detecting changes. Refresh linked thread snapshots when draft status changes, and include draft status in reports from connected environments.

Scope and approval

This is a focused fix for an obvious stale sidebar status. The thread details menu already reads the current draft status, but the sidebar's saved snapshot did not update when only that status changed.

Verification

Ran 162 focused tests, package typechecks for the server, client runtime, and contracts, and lint on the changed files. Lint reported existing warnings. Browser verification was not run.

- Notify linked threads when draft status changes during PR reads
- Report draft status across routed environments
@github-actions github-actions Bot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Oct 21, 2026
@github-actions github-actions Bot added the size:M 30-99 changed lines (additions + deletions). label Oct 21, 2026
@macroscopeapp

macroscopeapp Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 1e4d9ce

Macroscope's review found this PR approvable — This is a narrowly scoped fix to propagate pull request draft-status transitions through the existing server, routing, and synchronization paths. The contract addition is optional and backward-compatible, and the production behavior is covered by focused tests without changing defaults or static-analysis configuration.

No code changes detected at b6f33dc. Prior analysis still applies.

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

@coderabbitai

coderabbitai Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Path: .coderabbit.config.ts
  • Review profile: CHILL
  • Plan: Team
  • Run ID: 781a0ed8-3bf7-427b-9bc7-281826f77634
📥 Commits

Reviewing files that changed from the base of the PR and between 96f09c6 and b6f33dc.

📒 Files selected for processing: 8
  • apps/server/src/git/GitManager.test.ts
  • apps/server/src/git/GitManager.ts
  • apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts
  • apps/server/src/pullRequest/PullRequestService.test.ts
  • apps/server/src/pullRequest/PullRequestService.ts
  • packages/client-runtime/src/state/pullRequestRouting.ts
  • packages/client-runtime/src/state/pullRequests.test.ts
  • packages/contracts/src/pullRequest.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.

📝 Walkthrough

Pull request state reporting and change detection now include optional draft status. The server publishes changes when draft status changes, deduplicates reports using both state and draft status, and synchronizes updated status.

Changes: Draft-status propagation

Layer / File(s) Summary
Status contract and routed propagation
packages/contracts/src/pullRequest.ts, packages/client-runtime/src/state/pullRequestRouting.ts, packages/client-runtime/src/state/pullRequests.test.ts
The report-state contract accepts optional isDraft. Client routing forwards it when present, and detail-read tests cover absent, true, and false values.
Server-side draft change detection
apps/server/src/pullRequest/PullRequestService.ts, apps/server/src/git/GitManager.ts, apps/server/src/pullRequest/PullRequestService.test.ts, apps/server/src/git/GitManager.test.ts
Pull request detail readings and Git lookup state include draft status. The server publishes notifications when state or draft status changes. Tests cover draft transitions and stale reads.
State report deduplication and sync
apps/server/src/pullRequest/PullRequestService.ts, apps/server/src/pullRequest/PullRequestService.test.ts, apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts
The server deduplicates reports using both state and draft status. Reactor tests verify cache invalidation and synchronization with the updated draft status.

Priority: ⬇️ Low

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

Change: Bug fix

Sequence Diagram(s)

sequenceDiagram
  participant ClientRuntime
  participant PullRequestService
  participant PullRequestSyncReactor
  participant SyncCommand
  ClientRuntime->>PullRequestService: Report state with optional isDraft
  PullRequestService->>PullRequestSyncReactor: Publish state-change event
  PullRequestSyncReactor->>PullRequestSyncReactor: Invalidate pull request cache
  PullRequestSyncReactor->>SyncCommand: Dispatch updated isDraft value
Loading

Suggested reviewers: t3dotgg, flamboh

Merge Risk: ⚪ Minimal · up to b6f33

Draft-status propagation is mergeable after normal checks; no outstanding issue is supported by the reviewed evidence.

Pre-merge checks: Passed 4
Check name Status Explanation
Title check Passed The title is concise, uses the repository's conventional format, and clearly describes syncing pull request draft status changes.
Description check Passed The description includes all required sections. It explains the stale-status problem, the implementation change, the focused scope justification, and the verification performed, including limitations.
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.
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 5.0 KiB 5.0 KiB +7 B (+0.1%) 6.8 KiB ✅
Codex Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Codex Live turn WebSocket wire 1.2 KiB 1.2 KiB +7 B (+0.6%) 2.0 KiB ✅
Codex Live turn WebSocket decoded 20.9 KiB 20.9 KiB 0 B (0.0%) 29.3 KiB ✅
Codex Live turn messages 2 2 0 (0.0%) 8 ✅
Claude Total thread wire 5.0 KiB 5.0 KiB −7 B (−0.1%) 6.8 KiB ✅
Claude Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Claude Live turn WebSocket wire 1.2 KiB 1.2 KiB −7 B (−0.6%) 2.0 KiB ✅
Claude Live turn WebSocket decoded 21.2 KiB 21.2 KiB 0 B (0.0%) 29.3 KiB ✅
Claude Live turn messages 2 2 0 (0.0%) 8 ✅

Baseline: 96f09c6 · PR result: b6f33dc · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 108.5 KiB
  • Claude decoded thread snapshot: 108.8 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@Yash-Singh1
Yash-Singh1 merged commit 70e5e38 into main Oct 21, 2026
29 checks passed
@Yash-Singh1
Yash-Singh1 deleted the t3/sync-pr-draft-sidebar-status branch October 21, 2026 22:23
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Oct 22, 2026
## What's Changed
* docs(agents): proof for a bug fix depends on the bug by @juliusmarminge in pingdotgg/t3code#23008
* fix(server): removing a worktree on Windows no longer deletes what its junctions point to by @SunkenInTime in pingdotgg/t3code#21099
* perf(web): a streaming thread re-renders only its own sidebar row by @juliusmarminge in pingdotgg/t3code#22730
* refactor(web): the add environment dialog owns its form state by @juliusmarminge in pingdotgg/t3code#22686
* fix(desktop): use Clerk's upstream fix for abandoned browser sign-ins by @wobsoriano in pingdotgg/t3code#23038
* feat: show automation messages as compact timeline rows by @juliusmarminge in pingdotgg/t3code#22638
* feat(server,web,mobile): approvals in full access say why Claude asked by @juliusmarminge in pingdotgg/t3code#22546
* feat(claude): idle compaction has a global default and per-instance overrides by @juliusmarminge in pingdotgg/t3code#23037
* perf(web): typing no longer re-renders the traits picker or attach button by @juliusmarminge in pingdotgg/t3code#23040
* refactor(web): the composer's layout and provider hooks live in their own files by @juliusmarminge in pingdotgg/t3code#23042
* refactor(web): the prompt stash lives in useComposerStash by @juliusmarminge in pingdotgg/t3code#23046
* refactor(web): composer context imports live in useComposerContextImport by @juliusmarminge in pingdotgg/t3code#23048
* refactor(web): composer file intake lives in useComposerAttachmentIntake by @juliusmarminge in pingdotgg/t3code#23049
* refactor(web): the composer's footer controls render in ComposerControlsBar by @juliusmarminge in pingdotgg/t3code#23058
* refactor(web): composer key handling lives in useComposerCommandKey by @juliusmarminge in pingdotgg/t3code#23060
* refactor(web): ChatView's send paths live in useComposerSend by @juliusmarminge in pingdotgg/t3code#23062
* refactor(web): ChatView's terminal actions live in useChatTerminalActions by @juliusmarminge in pingdotgg/t3code#23063
* refactor(web): ChatView's right panel actions live in useRightPanelActions by @juliusmarminge in pingdotgg/t3code#23064
* refactor(web): ChatView's snooze, settle, and checkout actions live in useThreadLifecycle by @juliusmarminge in pingdotgg/t3code#23065
* refactor(web): ChatView's revert, rollback, and fork live in useTimelineRewind by @juliusmarminge in pingdotgg/t3code#23066
* refactor(web): ChatView's attachment preview handoff lives in useAttachmentPreviewHandoff by @juliusmarminge in pingdotgg/t3code#23067
* refactor(web): ChatView's project clone banner lives in useProjectCloneBanner by @juliusmarminge in pingdotgg/t3code#23068
* refactor(web): ChatView's model, mode, and workspace choices live in useComposerSelection by @juliusmarminge in pingdotgg/t3code#23069
* refactor(web): ChatView's pull request checkout lives in usePullRequestDraftThread by @juliusmarminge in pingdotgg/t3code#23070
* refactor(web): ChatView's thread derivations are tested functions in ChatView.logic by @juliusmarminge in pingdotgg/t3code#23071
* refactor(web): ChatView's paste-to-focus, titlebar controls, and timeline overlays move out by @juliusmarminge in pingdotgg/t3code#23072
* fix(cursor): a closed-stream write in the Cursor SDK no longer stops the server by @t3dotgg in pingdotgg/t3code#22897
* fix(server): Codex no longer offers a one-click update for installs it can't detect by @koushikxd in pingdotgg/t3code#22504
* fix(pi): declare properties on MCP tool schemas that omit them by @tlconde in pingdotgg/t3code#21822
* fix(server): a desktop backend whose launcher died shuts down cleanly instead of crashing by @SunkenInTime in pingdotgg/t3code#22471
* fix(mobile): chat feed no longer re-derives on every render by @t3dotgg in pingdotgg/t3code#22913
* docs(user): the outside agents guide says which addresses agents can sign in over by @Gourav224 in pingdotgg/t3code#22377
* fix(server): HTML preview reports a browser start error instead of an internal error by @t3dotgg in pingdotgg/t3code#22895
* fix(tailscale): a timed-out tailscale probe no longer outlives its call by @t3dotgg in pingdotgg/t3code#22900
* docs(composer): queued messages follow the Follow-up behavior setting by @t3dotgg in pingdotgg/t3code#22857
* fix(server): failed provider updates say why by @koushikxd in pingdotgg/t3code#22506
* test(telemetry): keep fixture PIDs from colliding with the test worker by @only21mil in pingdotgg/t3code#21446
* fix(server): server tests resolve the macOS temp dir symlink by @nabettu in pingdotgg/t3code#21442
* fix(scripts): mobile lint fails instead of passing when ktlint or detekt is missing by @t3dotgg in pingdotgg/t3code#22896
* fix(server): t3_thread_read clamps oversized page sizes instead of failing by @t3dotgg in pingdotgg/t3code#22901
* fix(mobile): opening a pull request no longer crashes with "Maximum update depth exceeded" by @nabettu in pingdotgg/t3code#22600
* fix(web): PR Code tab keeps its files after a refresh with an unchanged diff by @t3dotgg in pingdotgg/t3code#22917
* fix(web): finished provider updates no longer leave a hidden spinner in the sidebar by @t3dotgg in pingdotgg/t3code#22912
* fix(composer): mentions of files like `posts.$postId.tsx` or `[id].tsx` stay chips by @t3dotgg in pingdotgg/t3code#22922
* refactor(web): resuming an interrupted run lives in its own hook by @juliusmarminge in pingdotgg/t3code#23087
* refactor(web): proposed-plan follow-ups and implement-in-new-thread live in their own hooks by @juliusmarminge in pingdotgg/t3code#23091
* refactor(web): multiple-model sends live in their own hook by @juliusmarminge in pingdotgg/t3code#23094
* refactor(web): the composer send reads its own settings and draft instead of taking them from ChatView by @juliusmarminge in pingdotgg/t3code#23095
* refactor(web): ComposerControlsBar renders without a memo() wrapper by @juliusmarminge in pingdotgg/t3code#23093
* refactor(web): chat shortcuts live with the hooks that own their actions by @juliusmarminge in pingdotgg/t3code#23097
* refactor(web): ChatView's timeline banners render in ChatBannerLane by @juliusmarminge in pingdotgg/t3code#23101
* fix(web): the branch toolbar and thread details panel stay cached while a reply streams by @juliusmarminge in pingdotgg/t3code#23103
* fix(server): scheduled tasks no longer jump to the top when toggled by @t3dotgg in pingdotgg/t3code#22899
* fix(server): Forgejo and GitCafe pull requests link to their threads again by @MarcoDotIO in pingdotgg/t3code#22937
* fix(server): pushes the remote refuses say why instead of a generic failure by @t3dotgg in pingdotgg/t3code#22904
* fix(composer): typing a price no longer opens the skill menu by @MarcoDotIO in pingdotgg/t3code#21519
* fix(web): thread details PR merge uses the last selected merge method by @tris203 in pingdotgg/t3code#22399
* fix(web): a Usage toggle shortcut now goes back instead of staying on Usage by @t3dotgg in pingdotgg/t3code#22905
* fix(web): quote comment box stays on screen for long code lines by @EtanHey in pingdotgg/t3code#22149
* fix(web): right panel launcher letters open their surface instead of typing into the composer by @t3dotgg in pingdotgg/t3code#22898
* fix(web): ../ file links outside the workspace open as host files by @t3dotgg in pingdotgg/t3code#22853
* fix(shared): recognize relative folder links with trailing slash by @macodev00 in pingdotgg/t3code#22188
* fix(client): usage limits skip disabled connections by @M4NU5 in pingdotgg/t3code#22936
* fix(web): imported VS Code themes keep destructive buttons red by @lgollut in pingdotgg/t3code#21924
* fix(shared): Azure DevOps repositories with a space in the name list their pull requests by @Tabonx in pingdotgg/t3code#22782
* fix(opencode): cancelled todos no longer keep the todo list running by @MarcoDotIO in pingdotgg/t3code#22938
* fix(web): copy to machine clones the fork, not its upstream by @AKolenda in pingdotgg/t3code#22492
* fix(server): JetBrains IDEs open file links at the right column by @levochkaa in pingdotgg/t3code#22826
* fix(server): sync pull request draft status changes by @Yash-Singh1 in pingdotgg/t3code#22832
* test(web): chat shortcut test types through the composer handle by @juliusmarminge in pingdotgg/t3code#23126
* fix(source-control): merge messages drop Claude Code's current claude.com footer by @MarcoDotIO in pingdotgg/t3code#23133

## New Contributors
* @Gourav224 made their first contribution in pingdotgg/t3code#22377
* @nabettu made their first contribution in pingdotgg/t3code#21442
* @MarcoDotIO made their first contribution in pingdotgg/t3code#22937
* @M4NU5 made their first contribution in pingdotgg/t3code#22936
* @lgollut made their first contribution in pingdotgg/t3code#21924
* @Tabonx made their first contribution in pingdotgg/t3code#22782
* @levochkaa made their first contribution in pingdotgg/t3code#22826

**Full Changelog**: pingdotgg/t3code@v0.1.2-nightly.20261021.3486...v0.1.2-nightly.20261021.3499

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.2-nightly.20261021.3499
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