Hmbown/CodeWhale · error · Error
GitHub Release ${tag} did not provide an asset inventory
Error message
GitHub Release ${tag} did not provide an asset inventory What it means
The release JSON was fetched and parsed, but the object has no usable assets field (release.assets is missing or not an Array). GitHub's release object always includes assets, so this indicates schema drift or output interception: a GitHub Enterprise version with a different response shape, a proxy returning a JSON error object with exit 0, or a stubbed/mocked gh in tests.
Source
Thrown at scripts/release/ensure-release-assets-absent.js:58
const detail = String(error && error.stderr ? error.stderr : "").trim();
throw new Error(
`Could not inspect GitHub Release ${tag}${detail ? `: ${detail}` : ""}`,
);
}
try {
return JSON.parse(output);
} catch (error) {
throw new Error(`GitHub Release ${tag} returned invalid JSON: ${error.message}`);
}
}
function assertReleaseAssetsAbsent(release, tag) {
if (release === null) {
return;
}
if (!release || !Array.isArray(release.assets)) {
throw new Error(`GitHub Release ${tag} did not provide an asset inventory`);
}
if (release.assets.length === 0) {
return;
}
const names = release.assets.map((asset) => asset && asset.name).filter(Boolean);
const inventory = names.length > 0 ? names.join(", ") : `${release.assets.length} unnamed asset(s)`;
throw new Error(
`Refusing to replace existing assets for ${tag}: ${inventory}. ` +
"A normal Release workflow rerun must never delete or overwrite public bytes.",
);
}
function main() {
if (process.argv.length !== 4) {
throw new Error(usage());
}
const repo = process.argv[2];View on GitHub (pinned to 8880682c63)
Solutions
- Inspect the actual JSON gh returns for that tag and compare it to the documented release schema
- If targeting GitHub Enterprise, confirm its API version includes assets on release objects
- Fix test stubs and GH_BIN wrappers to pass the gh response through unmodified (include "assets": [] at minimum)
Example fix
// before: stubbed gh returns '{ "id": 1 }' -> did not provide an asset inventory
// after: stub includes the field
// { "id": 1, "assets": [] } Defensive patterns
Strategy: type-guard
Type guard
function isReleaseWithAssetInventory(value) {
return value === null || (typeof value === "object" && Array.isArray(value.assets));
} Try / catch
const { fetchRelease } = require("./scripts/release/ensure-release-assets-absent");
const release = fetchRelease(repo, tag);
if (!isReleaseWithAssetInventory(release)) {
throw new Error(`unexpected release payload for ${tag}; inspect raw gh api output before proceeding`);
} Prevention
- On GitHub Enterprise, confirm the REST release schema includes assets before adopting the guard
- Keep test stubs of gh api faithful to the real payload (at minimum { assets: [] })
- Ensure proxies do not rewrite API responses on the runner's egress path
When it happens
Trigger: gh api resolving against a GitHub Enterprise instance whose release payload lacks assets; an interception layer returning a JSON error envelope; test harnesses stubbing gh api with a minimal object like {id: 1}.
Common situations: GHE deployments with older REST shapes; corporate proxies rewriting API responses; CI stubs of the gh binary; GH_BIN wrappers that reshape the payload.
Related errors
- GitHub Release ${tag} returned invalid JSON: ${error.message
- Invalid GitHub repository: ${repo}
- Could not inspect GitHub Release ${tag}: ${detail}
- Refusing to replace existing assets for ${tag}: ${inventory}
- Usage: node scripts/release/ensure-release-assets-absent.js
AI-assisted analysis of Hmbown/CodeWhale@8880682c63 (2026-08-16).
Data as JSON: /api/errors/972fe937afed7378.
Report an issue: GitHub.