abhigyanpatwari/GitNexus · error · ValueError
candidate overlay is byte-identical to the incumbent skills
Error message
candidate overlay is byte-identical to the incumbent skills
What it means
Raised by commit_candidate_overlay after it stages the proposer's skill overlay into the sandbox git clone and runs `git diff --cached --quiet`. Exit code 0 means the staged tree is byte-identical to HEAD, so the candidate introduced no change. The harness refuses to spend a benchmark run on a no-op candidate, since promotion evidence would be pure noise.
Source
Thrown at eval/workflow_bench/evolution.py:404
mkdir_command = ["/bin/mkdir", "-p", f"{SANDBOX_TMP}/wfbench-empty-hooks"]
mkdir_result = sandbox.run(
mkdir_command,
timeout=60,
env=build_sandbox_environment(),
)
if not mkdir_result.ok:
raise ManagedProcessError(mkdir_command, mkdir_result)
command, added = _sandbox_overlay_git(sandbox, ["add", "--", *relative_paths])
if not added.ok:
raise ManagedProcessError(command, added)
command, changed = _sandbox_overlay_git(
sandbox,
["diff", "--cached", "--quiet", "--no-ext-diff", "--no-textconv", "--"],
)
if changed.returncode == 0:
raise ValueError("candidate overlay is byte-identical to the incumbent skills")
if changed.returncode != 1:
raise ManagedProcessError(command, changed)
command, committed = _sandbox_overlay_git(
sandbox,
[
"commit",
"--quiet",
"--no-verify",
"-m",
"benchmark candidate skill overlay",
],
extra_config=(
"user.name=workflow-bench",
"user.email=workflow-bench@invalid",
),
)
if not committed.ok:View on GitHub (pinned to d540b00184)
Solutions
- Before staging, diff the overlay against the incumbent: `diff -r <incumbent>/.claude/skills/<skill> <overlay>/.claude/skills/<skill>` and confirm at least one changed byte.
- Re-read the proposer's proposal file — if it claims a change but the bytes match, the proposer's in-session edit failed; regenerate the candidate.
- If the no-op is intentional (e.g. testing the gate), catch the ValueError and treat the generation as 'no candidate produced'.
Example fix
# before
commit_candidate_overlay(overlay, worktree=clone, sandbox=session)
# after: skip no-op overlays before they reach git
from eval.workflow_bench.evolution import candidate_overlay_payload
import pathlib
def _incumbent_bytes(clone, rel):
p = pathlib.Path(clone) / rel
return p.read_bytes() if p.exists() else b""
digest, payload = candidate_overlay_payload(overlay)
if all(_incumbent_bytes(clone, rel.as_posix()) == content for rel, content in payload):
raise SystemExit("no-op candidate; refusing to stage")
commit_candidate_overlay(overlay, worktree=clone, sandbox=session) Defensive patterns
Strategy: validation
Validate before calling
from pathlib import Path
from eval.workflow_bench.evolution import candidate_overlay_payload
def overlay_changes_anything(overlay: Path, clone: Path) -> bool:
"""True if at least one overlay byte differs from the incumbent clone."""
_, payload = candidate_overlay_payload(overlay)
for rel, content in payload:
incumbent = clone / Path(*rel.parts)
if not incumbent.exists() or incumbent.read_bytes() != content:
return True
return False
# gate the call
if not overlay_changes_anything(overlay, clone):
raise SystemExit("no-op candidate; skip commit_candidate_overlay") Prevention
- Always diff overlay vs incumbent before staging; a zero diff is a logic error in the proposer.
- Have the proposer write a proposal file whose stated change you can verify byte-for-byte.
- Treat a no-op candidate as 'no generation', not as a failure to retry unchanged.
When it happens
Trigger: The proposer copied the incumbent skill verbatim into the overlay; its only edit was a sed/heredoc that matched nothing; whitespace/encoding that already matched; or the overlay only touches skills no benchmarked arm loads (so the bytes round-trip). Any of these leaves `git add` with nothing to diff against HEAD.
Common situations: First-generation conservative proposers; an overlay built with `cp <incumbent> <overlay>` where the follow-up edit step was skipped or failed silently inside the no-Write-tool proposer session; re-running the same candidate twice.
Related errors
- {label} is unavailable: {path}: {exc}
- {label} must be a real non-symlink directory: {path}
- {label} contains an unsafe path component: {relative}
- {label} is unreadable: {path}: {exc}
- {label} must be a regular non-symlink file: {path}
AI-assisted analysis of abhigyanpatwari/GitNexus@d540b00184 (2026-08-12).
Data as JSON: /api/errors/00495ad03a17480b.
Report an issue: GitHub.