fix(server): resume checkpointing after git init - #10078
Conversation
- Preserve completion checkpoints when no pre-turn Git baseline exists - Add coverage for Git initialization between and during turns
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This is a focused checkpointing bug fix that preserves existing behavior when a baseline exists and safely records checkpoints when Git is initialized mid-flow. Regression coverage exercises the affected lifecycle paths and confirms subsequent turn diffs resume normally. You can add or adjust custom eligibility rules. Learn more. |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 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.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
## What's Changed * chore: configure Knip workspace audits by @juliusmarminge in pingdotgg/t3code#9958 * refactor(web): prune unused UI and provider code by @juliusmarminge in pingdotgg/t3code#9959 * chore(mobile): remove obsolete widget wiring script by @juliusmarminge in pingdotgg/t3code#9960 * chore: remove redundant root tooling dependencies by @juliusmarminge in pingdotgg/t3code#9961 * ci: reject unused files and dependencies with Knip by @juliusmarminge in pingdotgg/t3code#9962 * test(contracts): keep driver default lookup private by @juliusmarminge in pingdotgg/t3code#9968 * test(server): remove Azure permissions constant snapshot by @juliusmarminge in pingdotgg/t3code#9973 * refactor(shared): remove unused viewport formatters by @juliusmarminge in pingdotgg/t3code#9970 * refactor(mobile): remove unused provider option summary by @juliusmarminge in pingdotgg/t3code#9971 * refactor(client-runtime): remove unused connection phase message by @juliusmarminge in pingdotgg/t3code#9972 * refactor(mobile): remove unused layout calculations by @juliusmarminge in pingdotgg/t3code#9974 * refactor(client-runtime): remove unused file position predicate by @juliusmarminge in pingdotgg/t3code#9976 * refactor(mobile): remove unused font size steppers by @juliusmarminge in pingdotgg/t3code#9975 * test(server): cover thread lookup through command invariants by @juliusmarminge in pingdotgg/t3code#9978 * test(server): remove provider equality wrapper fixture by @juliusmarminge in pingdotgg/t3code#9979 * test(server): assert the dispatched welcome thread model by @juliusmarminge in pingdotgg/t3code#9980 * refactor(desktop): remove unused keyring remediation text by @juliusmarminge in pingdotgg/t3code#9981 * refactor(desktop): remove test-only Electron error predicates by @juliusmarminge in pingdotgg/t3code#9982 * refactor(web): remove unused pull request state label by @juliusmarminge in pingdotgg/t3code#9984 * perf(web): keep timeline row reuse engaged while text streams by @juliusmarminge in pingdotgg/t3code#9909 * fix(web): reset markdown widgets when the previewed file changes by @juliusmarminge in pingdotgg/t3code#9910 * fix(mobile): keep highlighting review diffs after a long line by @juliusmarminge in pingdotgg/t3code#9911 * fix(marketing): align the endorsement carousel with its heading by @juliusmarminge in pingdotgg/t3code#9912 * fix(client): keep warm thread resumes live instead of flashing sync by @juliusmarminge in pingdotgg/t3code#9913 * test(server): remove authorization prompt snapshots by @juliusmarminge in pingdotgg/t3code#9985 * test(server): remove static OAuth page snapshots by @juliusmarminge in pingdotgg/t3code#9986 * test(server): remove provider label identity assertion by @juliusmarminge in pingdotgg/t3code#9987 * test(server): consolidate agent activity opt-in coverage by @juliusmarminge in pingdotgg/t3code#9988 * refactor(shared): remove unused preview URL predicate by @juliusmarminge in pingdotgg/t3code#9989 * refactor(shared): remove unused mention path serializer by @juliusmarminge in pingdotgg/t3code#9990 * refactor(shared): remove retired PATH capture parser by @juliusmarminge in pingdotgg/t3code#9991 * refactor(client-runtime): remove unused subagent selectors by @juliusmarminge in pingdotgg/t3code#9992 * refactor(web): test the live usage column builder by @juliusmarminge in pingdotgg/t3code#9993 * refactor(web): remove unused aspect ratio reconciler by @juliusmarminge in pingdotgg/t3code#9994 * refactor(web): remove obsolete cloud listing helpers by @juliusmarminge in pingdotgg/t3code#9995 * test(web): remove composer control style snapshots by @juliusmarminge in pingdotgg/t3code#9996 * test(web): keep the preview profile label helper private by @juliusmarminge in pingdotgg/t3code#9997 * test(server): cover raw OpenCode deltas through the adapter by @juliusmarminge in pingdotgg/t3code#9977 * refactor(web): remove obsolete pull request link opener by @juliusmarminge in pingdotgg/t3code#9983 * test(relay): keep the stage slug helper private by @juliusmarminge in pingdotgg/t3code#9998 * refactor(mobile): keep project selection helper private by @juliusmarminge in pingdotgg/t3code#9999 * refactor(mobile): keep review default ID helper private by @juliusmarminge in pingdotgg/t3code#10000 * refactor(mobile): remove unused native style constants by @juliusmarminge in pingdotgg/t3code#10001 * refactor(mobile): test terminal palettes through public theme API by @juliusmarminge in pingdotgg/t3code#10002 * refactor(mobile): remove unused file tree walkers by @juliusmarminge in pingdotgg/t3code#10003 * refactor(shared): keep persisted settings helpers private by @juliusmarminge in pingdotgg/t3code#10004 * test(mobile): remove mocked UUID shape assertions by @juliusmarminge in pingdotgg/t3code#10006 * refactor(mobile): test final connection status presentation by @juliusmarminge in pingdotgg/t3code#10007 * test(web): keep pull request menu items private by @juliusmarminge in pingdotgg/t3code#10016 * refactor(shared): test favicon selection through public API by @juliusmarminge in pingdotgg/t3code#10005 * refactor(server): remove test-only pricing normalizer by @juliusmarminge in pingdotgg/t3code#10017 * refactor(web): remove unused desktop update visibility helper by @juliusmarminge in pingdotgg/t3code#10014 * refactor(web): remove obsolete provider update helpers by @juliusmarminge in pingdotgg/t3code#10015 * refactor(web): remove unused terminal context preview formatter by @juliusmarminge in pingdotgg/t3code#10009 * refactor(web): test environment-scoped draft promotion by @juliusmarminge in pingdotgg/t3code#10010 * fix(web): retain wrapped row heights during edits by @juliusmarminge in pingdotgg/t3code#10018 * refactor(shared): remove unused Clerk hostname predicate by @juliusmarminge in pingdotgg/t3code#10008 * refactor(tailscale): keep package internals private by @juliusmarminge in pingdotgg/t3code#10011 * ci: reject unused tailscale exports with Knip by @juliusmarminge in pingdotgg/t3code#10012 * fix(web): keep chat media at a stable size while it loads by @juliusmarminge in pingdotgg/t3code#9938 * refactor(server): keep manifest age parsing private by @juliusmarminge in pingdotgg/t3code#10028 * refactor(mobile): remove unused awareness relay URL normalizer by @juliusmarminge in pingdotgg/t3code#10029 * refactor(server): remove unused startup heartbeat launcher by @juliusmarminge in pingdotgg/t3code#10030 * refactor(shared): keep search ranking comparator private by @juliusmarminge in pingdotgg/t3code#10031 * refactor(server): keep telemetry identity errors private by @juliusmarminge in pingdotgg/t3code#10032 * refactor(mobile): test composer persistence through the live decoder by @juliusmarminge in pingdotgg/t3code#10033 * refactor(web): remove unused sidebar selectors by @juliusmarminge in pingdotgg/t3code#10034 * refactor(server): keep Cursor fallback models private by @juliusmarminge in pingdotgg/t3code#10038 * refactor(web): remove unused xterm link range helpers by @juliusmarminge in pingdotgg/t3code#10040 * refactor(mobile): remove obsolete review list builder by @juliusmarminge in pingdotgg/t3code#10039 * test(server): remove duplicate VCS error constructor checks by @juliusmarminge in pingdotgg/t3code#10042 * refactor(mobile): keep appearance calculations private by @juliusmarminge in pingdotgg/t3code#10043 * refactor(web): remove unused sidebar menu action by @juliusmarminge in pingdotgg/t3code#10044 * refactor(web): test live Ghostty link resolution directly by @juliusmarminge in pingdotgg/t3code#10041 * test(server): exercise Codex prompts through public assembly by @juliusmarminge in pingdotgg/t3code#10045 * refactor(shared): remove unused elapsed-time adapter by @juliusmarminge in pingdotgg/t3code#10046 * refactor(web): remove unused preview thread reset helper by @juliusmarminge in pingdotgg/t3code#10049 * refactor(desktop): remove test-only error predicates by @juliusmarminge in pingdotgg/t3code#10047 * refactor(mobile): keep review reset hashing private by @juliusmarminge in pingdotgg/t3code#10048 * test(web): remove AppRoot element order snapshot by @juliusmarminge in pingdotgg/t3code#10052 * refactor(codex): keep app-server client internals private by @juliusmarminge in pingdotgg/t3code#10035 * ci: reject unused Codex client exports with Knip by @juliusmarminge in pingdotgg/t3code#10036 * refactor(server): simplify native telemetry error internals by @juliusmarminge in pingdotgg/t3code#10057 * refactor(mobile): remove write-only terminal font cache by @juliusmarminge in pingdotgg/t3code#10058 * refactor(web): remove obsolete HSL theme generator by @juliusmarminge in pingdotgg/t3code#10061 * refactor(mobile): remove obsolete native diff token stream by @juliusmarminge in pingdotgg/t3code#10062 * test(server): remove title prompt editorial snapshots by @juliusmarminge in pingdotgg/t3code#10063 * test(server): remove repeated runtime prompt interpolation cases by @juliusmarminge in pingdotgg/t3code#10059 * refactor(web): observe preview tests through the live registry by @juliusmarminge in pingdotgg/t3code#10064 * test(server): remove keybinding default assignment snapshot by @juliusmarminge in pingdotgg/t3code#10065 * refactor(mobile): remove obsolete whole-file review highlighters by @juliusmarminge in pingdotgg/t3code#10067 * test(server): cover CLI runner detection through command suggestions by @juliusmarminge in pingdotgg/t3code#10066 * refactor(mobile): remove unused cloud relay URL normalizer by @juliusmarminge in pingdotgg/t3code#10068 * refactor(web): test live keybinding resolvers directly by @juliusmarminge in pingdotgg/t3code#10069 * test(server): cover Grok skill parsing through discovery by @juliusmarminge in pingdotgg/t3code#10070 * test(web): remove mocked diff view prop snapshot by @juliusmarminge in pingdotgg/t3code#10073 * test(web): remove mocked annotation options snapshot by @juliusmarminge in pingdotgg/t3code#10074 * refactor(web): keep pending action labels private by @juliusmarminge in pingdotgg/t3code#10075 * refactor(mobile): remove unused cloud pending-status mapper by @juliusmarminge in pingdotgg/t3code#10071 * refactor(web): remove unused model picker hint helpers by @juliusmarminge in pingdotgg/t3code#10072 * fix(server): resume checkpointing after git init by @Yash-Singh1 in pingdotgg/t3code#10078 * feat(web): first-run welcome wizard with agent setup and project import by @t3dotgg in pingdotgg/t3code#5362 **Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260905.1285...v0.0.39-nightly.20260905.1286 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260905.1286
Negative repository detects are TTL-cached for 15s, so pingdotgg#10078 could not resume checkpoints on the next turn after git init. Checkpoint isGitRepository now probes fresh. Made with grok-4.6
* fix(server): capture complete turn checkpoints after edits finish Mid-turn provider diffs were treated as the final checkpoint, nested Git workspaces were skipped, and huge patches truncated automatic summaries. Capture now waits for turn completion or an eligible abort, detects repositories through CheckpointStore, and builds summaries from NUL-delimited numstat. Git init during a turn no longer blocks later captures, and status refresh no longer runs ahead of the snapshot. Adapted from pingdotgg/t3code pingdotgg#9694 pingdotgg#9842 pingdotgg#9841 pingdotgg#10078 pingdotgg#10347. * fix(server): scope nested checkpoint summaries to the workspace Automatic numstat compared full parent-repository trees, so a sibling commit between nested-workspace captures showed up in the turn file list. Restrict numstat diffs to the session cwd. On-demand patches stay whole-tree.
…#229) * fix(server): capture complete turn checkpoints after edits finish Mid-turn provider diffs were treated as the final checkpoint, nested Git workspaces were skipped, and huge patches truncated automatic summaries. Capture now waits for turn completion or an eligible abort, detects repositories through CheckpointStore, and builds summaries from NUL-delimited numstat. Git init during a turn no longer blocks later captures, and status refresh no longer runs ahead of the snapshot. Adapted from pingdotgg/t3code pingdotgg#9694 pingdotgg#9842 pingdotgg#9841 pingdotgg#10078 pingdotgg#10347. * fix(server): keep attachments until commit and allow first-send retry Attachment cleanup ran inside the command receipt transaction, so a later write failure restored rows while deleting files. Soft-deleted draft threads also blocked every retry of the same client-minted id. Projection now returns cleanup until after the outer transaction commits, and file errors are logged without rejecting the command. requireThreadAbsent only blocks live rows. Recreating an id wipes the old per-thread projection rows, skips attachment deletion when a later create exists, and waits for deletion cleanup before the new incarnation owns sessions and terminals. Adapted from pingdotgg/t3code pingdotgg#7941 pingdotgg#8226. * fix(server): subscribe thread deletion before activation parks forkParked delayed the hot-stream subscription until after startup returned. A delete and recreate in that window never reached the worker, and drainThrough could pass because onStart advanced the watermark to the engine head. Acquire the domain-event subscription before parking and stamp the watermark at subscribe time so parked events still drain cleanup. * test(server): brand terminal close thread ids in deletion reactor coverage CI typecheck rejected the parked delete/recreate test because TerminalCloseInput uses a plain string thread id. Convert it to ThreadId before recording cleanup. * fix(server): scope nested checkpoint summaries to the workspace Automatic numstat compared full parent-repository trees, so a sibling commit between nested-workspace captures showed up in the turn file list. Restrict numstat diffs to the session cwd. On-demand patches stay whole-tree.
(cherry picked from commit c843c19) Upstream-PR: 10078
Prevents this error from happening on a turn after

git initWhat Changed
Why
Checkpointing could stop after Git initialization, preventing subsequent turns from being captured reliably. This restores checkpointing once repository setup completes and hardens related cross-surface behavior with targeted tests.
UI Changes
Checklist