can1357/oh-my-pi · error · Error
GitHub release asset ${binaryName} is not fully uploaded
Error message
GitHub release asset ${binaryName} is not fully uploaded What it means
GitHub assets expose a `state` field; only `uploaded` means the asset transfer completed and is served publicly. The updater refuses to download an asset that is still being uploaded (`start`/`new`/`uploading`) or whose record is malformed, because a partial binary would fail integrity verification anyway.
Source
Thrown at packages/coding-agent/src/cli/update-cli.ts:219
}
if (release.draft !== false) {
throw new Error(`GitHub release ${expectedTag} is a draft, not a published release`);
}
if (release.prerelease !== false && !options.allowPrerelease) {
throw new Error(`GitHub release ${expectedTag} is a prerelease; only canary updates install prerelease assets`);
}
if (!Array.isArray(release.assets)) {
throw new Error(`GitHub release ${expectedTag} has no asset list`);
}
const matches = release.assets.filter(asset => isRecord(asset) && asset.name === binaryName);
if (matches.length !== 1) {
throw new Error(`GitHub release ${expectedTag} has ${matches.length} assets named ${binaryName}`);
}
const asset = matches[0];
if (!isRecord(asset) || asset.state !== "uploaded") {
throw new Error(`GitHub release asset ${binaryName} is not fully uploaded`);
}
if (typeof asset.size !== "number" || !Number.isSafeInteger(asset.size) || asset.size <= 0) {
throw new Error(`GitHub release asset ${binaryName} has an invalid size`);
}
if (typeof asset.digest !== "string") {
throw new Error(`GitHub release asset ${binaryName} has no digest`);
}
const digest = /^sha256:([0-9a-f]{64})$/i.exec(asset.digest)?.[1];
if (!digest) {
throw new Error(`GitHub release asset ${binaryName} has an unsupported digest`);
}
const expectedUrl = `https://github.com/${REPO}/releases/download/${expectedTag}/${binaryName}`;
if (asset.browser_download_url !== expectedUrl) {
throw new Error(`GitHub release asset ${binaryName} has an unexpected download URL`);
}
return {View on GitHub (pinned to 9690622007)
Solutions
- Wait a minute or two for the asset upload to complete, then retry the update.
- Check the release page for a stuck/failed upload; delete and re-upload the affected asset.
- If a workflow publishes before uploading, fix it to upload all assets before the publish step.
- Verify asset state via the API: curl https://api.github.com/repos/<owner>/<repo>/releases/tags/<tag> and check assets[].state.
Defensive patterns
Strategy: retry
Validate before calling
const asset = release.assets?.find(a => a?.name === binaryName);
if (asset && asset.state !== "uploaded") {
console.log("Asset still uploading; waiting 30s...");
await Bun.sleep(30_000);
} Type guard
function isUploadedAsset(asset: unknown): asset is { state: "uploaded"; size: number; digest: string; browser_download_url: string } {
return typeof asset === "object" && asset !== null && (asset as { state?: unknown }).state === "uploaded";
} Try / catch
for (let attempt = 0; attempt < 3; attempt++) {
try { await update(); break; }
catch (err) {
if (err instanceof Error && err.message.includes("not fully uploaded")) {
await Bun.sleep(30_000);
continue;
}
throw err;
}
} Prevention
- Wait a short grace period after a release is announced before running updates.
- Ensure release workflows upload all assets before flipping the release from draft to published.
- Alert on failed upload steps in release CI so assets are never left partial.
When it happens
Trigger: resolveReleaseBinaryAsset throws when the matched asset fails `isRecord(asset) || asset.state !== "uploaded"` — the asset state is anything other than "uploaded" or the asset entry is not an object.
Common situations: Running the updater seconds after a release is published while GitHub is still finalizing asset uploads, a release workflow that published the release before all uploads finished, or a failed/interrupted upload leaving the asset in a non-uploaded state.
Related errors
- GitHub release ${expectedTag} has ${matches.length} assets n
- GitHub release asset ${binaryName} has an invalid size
- GitHub release ${expectedTag} has no asset list
- GitHub release asset ${binaryName} has no digest
- GitHub release asset ${binaryName} has an unsupported digest
AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31).
Data as JSON: /api/errors/a3c7d5c2e6446d99.
Report an issue: GitHub.