Skip to content

[Bug]: rollback ("edit from here") silently hidden in non-git workspaces, conversation-only rewind blocked too #17187

Description

@eliottscherrer

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

  1. open a thread whose workspace is not a git repo (scratch project)
  2. hover one of your own past messages in the timeline
  3. 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 with status: "missing" when isGitCheckpointable(cwd) is false
  • the client only maps ready checkpoints into the per-message revertTurnCount that 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:376

Screenshots, 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

  1. added
    bugSomething is broken or behaving incorrectly.
    needs-triageIssue needs maintainer review and initial categorization.
    on Oct 8, 2026
  2. kushaldotdev commented on Oct 9, 2026

    @kushaldotdev

    The silent hiding is two separate gates: the conversation rewind target comes from the server (typeof revertTurnCount === "number" in apps/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".

  3. eliottscherrer commented on Oct 10, 2026

    @eliottscherrer
    Author

    4. The silent hiding is two separate gates: the conversation rewind target comes from the server (typeof revertTurnCount === "number" in apps/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".

    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

  4. kushaldotdev commented on Oct 11, 2026

    @kushaldotdev
    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
    

    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 init that 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething is broken or behaving incorrectly.needs-triageIssue needs maintainer review and initial categorization.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions