{"record":{"id":"c2186368230f6619","repo":"paperclipai/paperclip","slug":"refusing-terminal-workspace-cleanup-because-the-ex","errorCode":null,"errorMessage":"Refusing terminal workspace cleanup because the expected git HEAD is unknown","messagePattern":"Refusing terminal workspace cleanup because the expected git HEAD is unknown","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/src/services/execution-workspaces.ts","lineNumber":1452,"sourceCode":"            && workspaceHeadSha !== null\n          ) {\n            mergedPullRequest = true;\n            break;\n          }\n          if (\n            details.state === \"unknown\"\n            || (details.state === \"merged\" && (!details.headRef || !details.headSha || !workspaceHeadSha))\n          ) {\n            pullRequestStateUnknown = true;\n          }\n        }\n        if (mergedPullRequest) break;\n      }\n    }\n\n    return {\n      deliveryState: deriveExecutionWorkspaceDeliveryState({\n        sourceIssueTerminal,\n        mergedPullRequest,\n        pullRequestStateUnknown,\n        isMergedIntoBase: git?.isMergedIntoBase ?? null,\n      }),\n      sourceIssueTerminal,\n      subtreeTerminal,\n      cooldownAnchor,\n      workspaceDirty: Boolean(git?.hasDirtyTrackedFiles || git?.hasUntrackedFiles),\n      workspaceHeadSha,\n    };\n  }\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);","sourceCodeStart":1434,"sourceCodeEnd":1470,"githubUrl":"https://github.com/paperclipai/paperclip/blob/3f1d897a7c018d76563a21c6e39c3c9b03933622/server/src/services/execution-workspaces.ts#L1434-L1470","documentation":"Fail-closed safety check in assertTerminalCleanupGitStateUnchanged: a git_worktree workspace is about to be terminally cleaned up, but either its local path or the expected HEAD SHA (workspaceHeadSha captured when delivery was verified) is unknown. Without a pinned expected HEAD the 'unchanged since verification' invariant cannot be checked, so destructive cleanup is refused.","triggerScenarios":"Thrown at server/src/services/execution-workspaces.ts:1446 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Restore the expected git HEAD record for the workspace before cleanup, or clean up the workspace manually."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"3f1d897a7c018d76563a21c6e39c3c9b03933622","analyzedAt":"2026-08-18T22:49:45.177Z","contentChangedAt":"2026-08-18T22:49:45.177Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}