NousResearch/hermes-agent · error · RuntimeError
No checksum entry for {asset_name} in {checksum_file.name}
Error message
No checksum entry for {asset_name} in {checksum_file.name} What it means
After downloading checksums.txt, the installer parses standard `sha256sum` output (`<hex> <filename>`) and looks for a line whose last field equals the computed asset name. If no line matches, it refuses to proceed — there is no unsigned path. This almost always means the release's asset naming scheme and the locally computed asset name have drifted.
Source
Thrown at agent/proxy_sources/iron_proxy.py:640
# A present signature that does NOT verify is a tamper signal — fail hard.
raise RuntimeError(
"iron-proxy checksums.txt failed GPG signature verification — "
"refusing to install (possible release-channel tampering). "
f"gpg: {verify.stderr.decode('utf-8', 'replace')[:300]}"
)
logger.info("Verified iron-proxy checksums.txt GPG signature.")
return True
def _expected_sha256(checksum_file: Path, asset_name: str) -> str:
"""Parse the standard ``sha256sum`` output: ``<hex> <filename>``."""
text = checksum_file.read_text(encoding="utf-8", errors="replace")
for line in text.splitlines():
parts = line.strip().split()
if len(parts) >= 2 and parts[-1] == asset_name:
return parts[0]
raise RuntimeError(
f"No checksum entry for {asset_name} in {checksum_file.name}"
)
def _sha256_file(path: Path) -> str:
h = hashlib.sha256()
with open(path, "rb") as f:
for chunk in iter(lambda: f.read(65536), b""):
h.update(chunk)
return h.hexdigest()
def _pick_tar_member(tf: tarfile.TarFile, binary_name: str) -> tarfile.TarInfo:
"""Find the binary inside the upstream tar.
iron-proxy's archive is typically flat (binary at root) but we tolerate
a top-level directory. Members must be regular files with a leaf name
matching ``binary_name``, no absolute paths, and no ``..`` traversal.View on GitHub (pinned to c896c09c42)
Solutions
- Open the release page for _IRON_PROXY_VERSION and compare the published asset filenames against what the error's asset_name implies; align the naming in _platform_asset_name (or the version pin) with the actual release.
- If your arch genuinely has no asset, install the binary manually on a supported host or build from source and place it where find_iron_proxy() looks.
- Downgrade/pin to the last release whose checksums.txt contains your asset name until the module is updated.
Defensive patterns
Strategy: validation
Validate before calling
import urllib.request, json
def asset_in_release(api_url: str, asset_name: str) -> bool:
with urllib.request.urlopen(api_url, timeout=15) as r:
assets = [a["name"] for a in json.load(r).get("assets", [])]
return asset_name in assets Try / catch
try:
find_iron_proxy(install_if_missing=True)
except RuntimeError as e:
if "No checksum entry" in str(e):
# version pin / asset naming drift — update pin or install manually
raise Prevention
- After bumping _IRON_PROXY_VERSION, run a canary `hermes egress install` in CI to catch asset-naming drift before users do.
- Pre-install binaries in machine images so naming drift never hits runtime paths.
When it happens
Trigger: find_iron_proxy(install_if_missing=True) when _platform_asset_name() produces a name like iron-proxy_vX_linux_arm64.tar.gz but the release names assets differently (e.g. dropped the arch suffix, switched to .zip, or renamed to iron-proxy-linux-arm64.tar.gz). Also triggered by checksums.txt using different path prefixes per line.
Common situations: Upgrading iron-proxy upstream changed asset naming between versions while _IRON_PROXY_VERSION was bumped; running on an arch whose asset the release doesn't publish (e.g. linux armv7) so its entry simply isn't in checksums.txt.
Related errors
- Could not find {binary_name} inside downloaded archive (memb
- Unsupported platform for iron-proxy auto-install: {system} {
- Failed to download {url}: {exc}
- iron-proxy checksums.txt failed GPG signature verification —
- iron-proxy binary not available — run `hermes egress install
AI-assisted analysis of NousResearch/hermes-agent@c896c09c42 (2026-08-14).
Data as JSON: /api/errors/31b53fc21da91d94.
Report an issue: GitHub.