{"record":{"id":"879c3257682b9c19","repo":"GitoxideLabs/gitoxide","slug":"a-checked-out-review-root-cannot-suspend-while-ret","errorCode":null,"errorMessage":"a checked-out review root cannot suspend while returning from review","messagePattern":"a checked-out review root cannot suspend while returning from review","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"gix-tix/src/edit/forget.rs","lineNumber":99,"sourceCode":"    } else {\n        rebase::perform_deleting_refs_with_progress(\n            &repo,\n            graph,\n            rebase::Edit::Remove { target: id },\n            rebase::Signature::RedoIfNeeded,\n            rebase::Tree::LeaveAsIsAndMark,\n            deletions,\n            report,\n        )\n    }?;\n    Ok(match result {\n        rebase::Perform::Complete(outcome) => Perform::Complete(Outcome {\n            selected: outcome.selected,\n            review_return,\n            ref_changes: outcome.ref_changes,\n        }),\n        rebase::Perform::Conflict(rebase) => {\n            anyhow::ensure!(\n                review_return.is_none(),\n                \"a checked-out review root cannot suspend while returning from review\"\n            );\n            Perform::Conflict(Conflict { rebase })\n        }\n    })\n}\n\npub(super) fn preflight_tree_transition(\n    repo: &gix::Repository,\n    workdir: &Path,\n    old: ObjectId,\n    new: ObjectId,\n) -> Result<()> {\n    let mut index = gix::tempfile::writable_at(\n        std::env::temp_dir().join(format!(\n            \"tix-forget-index-{}-{old}-{:?}\",\n            std::process::id(),","sourceCodeStart":81,"sourceCodeEnd":117,"githubUrl":"https://github.com/GitoxideLabs/gitoxide/blob/e73179060badf27222d790981fac3f84c1830a7e/gix-tix/src/edit/forget.rs#L81-L117","documentation":"In gix-tix's `edit/forget.rs` (perform_conflict), when a rebase ends in Conflict while a `review_return` is pending (the tool is mid-way returning from a review checkout), the tool cannot suspend the operation — suspending would lose the return state. It refuses with this ensure! error to protect the review workflow invariant.","triggerScenarios":"Invoking the forget/edit operation while a review root is checked out AND the operation is in its return-from-review phase, and the underlying rebase reports a conflict.","commonSituations":"Users running tix edit/forget commands on top of an in-progress review return; concurrent review sessions; unresolved conflicts left from a previous review step.","solutions":["Finish or abort the in-progress review return before re-running the operation","Resolve the underlying rebase conflict so the rebase completes instead of suspending","Reset the review state (checkout the intended branch) and retry"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// refuse to run while a review return is pending\nif review_return.is_some() {\n    anyhow::bail!(\"finish or abort the in-progress review return first\");\n}","typeGuard":null,"tryCatchPattern":"if let Err(e) = perform(...) {\n    if e.to_string().contains(\"cannot suspend while returning from review\") {\n        // surface guidance to reset review state\n    }\n}","preventionTips":["Complete one tix review cycle before starting another edit operation","Avoid interrupting review-return flows mid-way","Check for pending review state files before automation runs"],"tags":["git","rebase","state-machine","review"],"backgroundTag":"invalid-state-transition","analyzedSha":"e73179060badf27222d790981fac3f84c1830a7e","analyzedAt":"2026-09-08T11:26:50.865Z","contentChangedAt":"2026-09-08T11:26:50.865Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}