From 266a604892b0ee7591a90c03e5c3067aad8baf96 Mon Sep 17 00:00:00 2001 From: mptyl Date: Sun, 9 Aug 2026 18:40:37 +0200 Subject: [PATCH] fix: distinguish evidence tree lookup failures --- backend/src/workspaces/git-repository.ts | 6 ++++-- backend/test/workspaces-git-repository.test.ts | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/backend/src/workspaces/git-repository.ts b/backend/src/workspaces/git-repository.ts index c562c8bf..c146523f 100644 --- a/backend/src/workspaces/git-repository.ts +++ b/backend/src/workspaces/git-repository.ts @@ -278,8 +278,10 @@ export class GitWorkspaceRepository { ); return stdout; } catch (error) { - if (invalidObjectMessage && typeof error === "object" && error !== null - && "code" in error && typeof error.code === "number") { + const stderr = typeof error === "object" && error !== null && "stderr" in error + && typeof error.stderr === "string" ? error.stderr : ""; + if (invalidObjectMessage + && /^fatal: path '[^']+' does not exist in '[0-9a-f]{40}'\s*$/u.test(stderr)) { throw new WorkspaceRegistryError("workspace_invalid", invalidObjectMessage); } throw this.sanitizeGitError(error); diff --git a/backend/test/workspaces-git-repository.test.ts b/backend/test/workspaces-git-repository.test.ts index 9ffbdae2..d2046735 100644 --- a/backend/test/workspaces-git-repository.test.ts +++ b/backend/test/workspaces-git-repository.test.ts @@ -142,6 +142,18 @@ test("redacts Git failures while checking an Evidence tree", async () => { expect((error as Error).message).not.toContain(fixture.root); }); +test("classifies repository corruption as unavailable rather than invalid Evidence", async () => { + const fixture = await temporaryRemote(); + const repository = new GitWorkspaceRepository(config(join(fixture.root, "registry"), fixture.remote)); + await repository.bootstrap(); + rmSync(join(repository.repoPath, ".git", "objects"), { recursive: true, force: true }); + + await expect(repository.assertTreeAtRevision( + fixture.initialCommit, + "workspace-content/research/evidence", + )).rejects.toMatchObject({ code: "git_unavailable", message: "Workspace Git operation failed" }); +}); + test("binds Evidence tree validation to old and new content-only commits", async () => { const fixture = await temporaryRemote(); const repository = new GitWorkspaceRepository(config(join(fixture.root, "registry"), fixture.remote));