{"record":{"id":"85b5053c0d4b2bc7","repo":"paperclipai/paperclip","slug":"refusing-terminal-workspace-cleanup-because-the-gi","errorCode":null,"errorMessage":"Refusing terminal workspace cleanup because the git status could not be verified","messagePattern":"Refusing terminal workspace cleanup because the git status could not be verified","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/src/services/execution-workspaces.ts","lineNumber":1455,"sourceCode":"  }\n\n  async function assertTerminalCleanupGitStateUnchanged(\n    workspace: ExecutionWorkspaceRow,\n    expectedHeadSha: string | null,\n  ) {\n    if (workspace.providerType !== \"git_worktree\") return;\n    const workspacePath = readNullableString(workspace.providerRef) ?? readNullableString(workspace.cwd);\n    if (!workspacePath || !expectedHeadSha) {\n      throw new Error(\"Refusing terminal workspace cleanup because the expected git HEAD is unknown\");\n    }\n\n    const [current, currentHeadSha, currentBranchName] = await Promise.all([\n      inspectGitCloseReadiness(toExecutionWorkspace(workspace)),\n      readGitStdout([\"rev-parse\", \"HEAD\"], workspacePath).catch(() => null),\n      readGitStdout([\"symbolic-ref\", \"--quiet\", \"--short\", \"HEAD\"], workspacePath).catch(() => null),\n    ]);\n    if (!current.statusInspectionSucceeded) {\n      throw new Error(\"Refusing terminal workspace cleanup because the git status could not be verified\");\n    }\n    if (\n      !current.git?.repoRoot\n      || current.git.hasDirtyTrackedFiles\n      || current.git.hasUntrackedFiles\n      || currentHeadSha !== expectedHeadSha\n      || (workspace.branchName && currentBranchName !== workspace.branchName)\n    ) {\n      throw new Error(\"Refusing terminal workspace cleanup because the git worktree changed after delivery was verified\");\n    }\n  }\n\n  async function hydrateWorkspace(row: ExecutionWorkspaceRow, runtimeServices: WorkspaceRuntimeService[] = []) {\n    const workspace = toExecutionWorkspace(row, runtimeServices);\n    const { git } = await inspectGitCloseReadiness(workspace);\n    const assessment = await assessDelivery(row, git);\n    return toExecutionWorkspace(row, runtimeServices, assessment.deliveryState);\n  }","sourceCodeStart":1437,"sourceCodeEnd":1473,"githubUrl":"https://github.com/paperclipai/paperclip/blob/a7e689b3c35347b529cb9f54c9b9a8575a3dcab6/server/src/services/execution-workspaces.ts#L1437-L1473","documentation":"Fail-closed safety check in assertTerminalCleanupGitStateUnchanged: re-inspecting the worktree (inspectGitCloseReadiness) failed (statusInspectionSucceeded false), so the current git status could not be verified against the state recorded at delivery verification. Terminal cleanup of an unverifiable worktree is refused.","triggerScenarios":"Thrown at server/src/services/execution-workspaces.ts:1455 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Verify git is available and the worktree is readable so status can be checked, then retry cleanup."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"a7e689b3c35347b529cb9f54c9b9a8575a3dcab6","analyzedAt":"2026-08-18T22:49:45.177Z","contentChangedAt":"2026-08-18T22:49:45.177Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}