abhigyanpatwari/GitNexus · critical · ValueError

oracle sanitization left the {label} recoverable

Error message

oracle sanitization left the {label} recoverable

What it means

The harness probes each forbidden object (the original HEAD commit, and the hidden harness tree) with `git cat-file -e <sha>`. If the probe exits 0 (probe.ok), the object is still present in the object store and recoverable by the model, so sanitization has failed to purge it.

Source

Thrown at eval/workflow_bench/oracle_assets.py:437

        ["git", "-C", str(root), "fsck", "--full", "--no-progress", "--no-reflogs", "--unreachable"],
        timeout=600,
        tail_bytes=MAX_CLONE_REF_BYTES,
    )
    if fsck.stdout_tail.strip() or fsck.stderr_tail.strip():
        raise ValueError("oracle sanitization left unreachable Git objects recoverable")

    forbidden_objects: list[tuple[str, str]] = []
    if original_head != sanitized_head:
        forbidden_objects.append((original_head, "original commit"))
    if hidden_tree:
        forbidden_objects.append((hidden_tree, "hidden harness tree"))
    for forbidden_object, label in forbidden_objects:
        probe = run_managed(
            ["git", "-C", str(root), "cat-file", "-e", forbidden_object],
            timeout=60,
        )
        if probe.ok:
            raise ValueError(f"oracle sanitization left the {label} recoverable")
        if probe.state != "exited" or probe.returncode not in {1, 128}:
            raise ValueError(f"oracle sanitization could not verify removal of the {label}")

    hidden_listing = _git_checked(
        root,
        ["ls-tree", "-r", "--name-only", "HEAD", "--", HIDDEN_HARNESS_PATH.as_posix()],
        timeout=60,
    )
    if hidden_listing or current.exists() or current.is_symlink():
        raise ValueError("oracle sanitization left the benchmark harness visible")
    if _git_checked(root, ["status", "--porcelain=v1", "--untracked-files=all"], timeout=60):
        raise ValueError("oracle sanitization did not produce a clean task snapshot")
    if _git_checked(root, ["rev-parse", "--verify", "HEAD^{commit}"], timeout=60) != sanitized_head:
        raise ValueError("oracle sanitization did not retain its parentless task snapshot")
    parents = _git_checked(root, ["show", "-s", "--format=%P", "HEAD"], timeout=60)
    if parents:
        raise ValueError("oracle sanitization snapshot unexpectedly retained parent history")
    if _git_checked(root, ["remote"], timeout=60):

View on GitHub (pinned to d540b00184)

Solutions

  1. Confirm: `git -C <clone> cat-file -e <original_head>`; if it prints nothing and exits 0, the object lives.
  2. Remove .keep files and repack aggressively: `rm -f <clone>/.git/objects/pack/*.keep && git -C <clone> repack -ad && git -C <clone> prune --expire=now`.
  3. Override pack retention: `git -C <clone> -c gc.bigPackThreshold=0 gc --prune=now`.
  4. If the object persists, re-clone from a sanitized source — the object store cannot be trusted.
Defensive patterns

Strategy: try-catch

Validate before calling

from pathlib import Path
from eval.workflow_bench.process_control import run_managed

def object_is_gone(clone: Path, sha: str) -> bool:
    r = run_managed(["git", "-C", str(clone), "cat-file", "-e", sha], timeout=60)
    return not r.ok

Type guard

def is_forbidden_object_recoverable(exc: BaseException) -> bool:
    return isinstance(exc, ValueError) and "left the" in str(exc) and "recoverable" in str(exc)

Try / catch

try:
    oracle_assets.sanitize_clone_for_hidden_oracles(clone)
except ValueError as exc:
    # The original commit or harness tree is still cat-file-able: a real leak.
    quarantine(clone)
    raise AbortTask(str(exc)) from exc

Prevention

When it happens

Trigger: Triggered when repack/prune left the original commit or the eval/workflow_bench tree reachable-by-SHA in a packfile or loose object after HEAD was rewritten and refs/reflogs were cleared.

Common situations: A .keep file pinning the original pack; gc.bigPackThreshold keeping large packs un-pruned; concurrent gc; a git version that does not prune objects referenced only by the reflog before reflog expiry took effect.

Related errors


AI-assisted analysis of abhigyanpatwari/GitNexus@d540b00184 (2026-08-12). Data as JSON: /api/errors/b514fd1c5f415810. Report an issue: GitHub.