Repository navigation
[Bug]: rollback ("edit from here") silently hidden in non-git workspaces, conversation-only rewind blocked too #17187
Description
Before submitting
- I searched existing issues and did not find a duplicate.
- I included enough detail to reproduce or investigate the problem.
Area
apps/server
Steps to reproduce
- open a thread whose workspace is not a git repo (scratch project)
- hover one of your own past messages in the timeline
- only "Copy message" shows up, no "edit from here" button, nothing explaining why
same driver (pi), same account, in a git-backed workspace (project repo or t3 worktree) the button shows up on hover and rollback works. so it's workspace dependent, not driver dependent
Expected behavior
rollback should work, at least conversation-only ("revert and keep changes", restoreFiles: false) which doesn't need a file checkpoint in the first place. or at least tell me why it's unavailable instead of silently hiding the button
Actual behavior
no rollback at all in non-git workspaces:
CheckpointCaptureServiceV2(apps/server/src/orchestration-v2/CheckpointService.ts:381, also :342) stores checkpoints withstatus: "missing"whenisGitCheckpointable(cwd)is false- the client only maps
readycheckpoints into the per-messagerevertTurnCountthat gates the "edit from here" button (deriveRevertTurnCountByUserMessageId,apps/web/src/session-logic.ts:1045) - server rollback resolution also hard-requires a ready checkpoint -> "Rollback target run ordinal N is unavailable for thread X"
so in a scratch (non-git) workspace the whole rollback feature is dropped, including "revert and keep changes" which is conversation-only and doesn't need any file checkpoint
also: the only "Roll back" button for checkpoint items (apps/web/src/components/chat/V2ItemInspector.tsx:376, gated on status === "ready") renders from timeline rows' projectedItem, but the timeline entry builder skips checkpoint items entirely (apps/web/src/session-logic.ts:631), so that button is unreachable from the timeline
Impact
Minor bug or occasional failure
Version or commit
0.0.46-nightly.20261008.2813
Environment
macOS 27.0 arm64, t3 code nightly desktop app, provider pi (pi 1.1.0)
Logs or stack traces
no stack traces, it's fully silent. evidence from ~/.t3/userdata/statev2.sqlite: threads in ~/.t3/scratch/* have all their checkpoint rows status="missing", threads in git worktrees have status="ready" (30 pi threads with 121 ready checkpoints, all git-backed)
source refs (main @ a4c9494b): CheckpointService.ts:381 + :342, session-logic.ts:1045 + :631, V2ItemInspector.tsx:376Screenshots, recordings, or supporting files
No response
Workaround
none in-app. running the conversation in a git-backed project (or git init-ing the workspace folder) makes checkpoints "ready" and the button shows up for subsequent turns. conversation-only rewind really shouldn't need a git repo at all tho?
Activity
kushaldotdev commentedon Oct 9, 2026
The silent hiding is two separate gates: the conversation rewind target comes from the server (
typeof revertTurnCount === "number"inapps/web/src/components/chat/MessagesTimeline.tsx), while file restore is separately gated on a worktree and refused when the directory is shared with another thread or session (docs/user/composer.md, "Edit an earlier prompt").So a non-git workspace loses the conversation-only rewind as well, even though that part needs no file restore. If the workspace gate is deliberate, a disabled control with a tooltip would at least explain the omission instead of showing only "Copy message".
eliottscherrer commentedon Oct 10, 2026
yeah that's exactly what i explain in my issue, i don't really understand your comment? it's basically just rephrasing what i say in my issue and it really seems to be AI generated
kushaldotdev commentedon Oct 11, 2026
Fair, and sorry — that comment was AI-written and it just restated what you already wrote in the issue. That was on me, not useful.
One thing I still can't tell from the report: in the non-git folder, does "Edit from here" come back if you
git initthat same folder while T3 is open, or only after reopening the thread? That would say whether the workspace check happens when the card is drawn or once per thread, which changes where the fix goes.fix(rewind): allow conversation-only rewind in non-git workspaces