stablyai/orca · error

Release ${tag} is missing required assets.

Error message

Release ${tag} is missing required assets.

What it means

Thrown by verifyRequiredReleaseAssets when at least one required asset is either entirely absent (missing), present but not in 'uploaded' state (notUploaded), or present but zero bytes (empty). The message aggregates all three defect classes with sorted lists so the failure names every offending asset at once.

Source

Thrown at config/scripts/verify-release-required-assets.mjs:124

    for (const referencedName of extractManifestAssetNames(manifestText)) {
      requiredNames.add(referencedName)
    }
  }

  const missing = [...requiredNames].filter((name) => !assetsByName.has(name)).sort()
  const notUploaded = [...requiredNames]
    .map((name) => assetsByName.get(name))
    .filter((asset) => asset && asset.state && asset.state !== 'uploaded')
    .map((asset) => `${asset.name}:${asset.state}`)
    .sort()
  const empty = [...requiredNames]
    .map((name) => assetsByName.get(name))
    .filter((asset) => asset && asset.size === 0)
    .map((asset) => asset.name)
    .sort()

  if (missing.length > 0 || notUploaded.length > 0 || empty.length > 0) {
    throw new Error(
      [
        `Release ${tag} is missing required assets.`,
        missing.length > 0 ? `Missing: ${missing.join(', ')}` : null,
        notUploaded.length > 0 ? `Not uploaded: ${notUploaded.join(', ')}` : null,
        empty.length > 0 ? `Empty: ${empty.join(', ')}` : null
      ]
        .filter(Boolean)
        .join('\n')
    )
  }

  return {
    tag,
    checked: [...requiredNames].sort(),
    draft: release.draft,
    prerelease: release.prerelease
  }
}

View on GitHub (pinned to 1136503c6a)

Solutions

  1. Re-read the error's Missing/Not uploaded/Empty lines to get the exact offending asset names.
  2. Confirm each missing asset was actually produced and uploaded by the build matrix in the same workflow run.
  3. If assets are 'Not uploaded', wait for GitHub to finalize upload state and re-run the gate (it is a timing-sensitive state).
  4. If assets are 'Empty', fix the upstream build step that produced a 0-byte artifact and re-upload.
  5. Align the required-assets list in config with the actual asset naming convention produced by the build.
Defensive patterns

Strategy: validation

Validate before calling

// Pre-check asset presence with the GitHub API in the workflow before the hard gate:
// gh release view "$TAG" --json assets --jq '.assets[].name'
// Compare against the required list; only invoke the verify script once all are present and uploaded.

Try / catch

// If you wrap the script in a retry loop, only retry on the 'Not uploaded' sub-condition
// (transient upload finalization), never on Missing or Empty (deterministic failures):
// for attempt in 1 2 3; do
//   out=$(node verify-release-required-assets.mjs "$TAG" 2>&1) && break
//   echo "$out" | grep -q 'Not uploaded:' || { echo "$out"; exit 1; }
//   sleep 5
// done

Prevention

When it happens

Trigger: A required asset name from the manifest/config is not present in the release's assets list; an asset upload to GitHub is still in 'starter' state when the gate runs; an asset was uploaded as a 0-byte file due to a broken build artifact; asset name mismatch (e.g. suffix or platform token differences) between the required list and what the build uploaded.

Common situations: Running the verify gate concurrently with or immediately after asset uploads before GitHub finalizes state; a build matrix job that was skipped or failed silently leaving an expected artifact unuploaded; rename of an asset in the build without updating the required-assets list; cross-platform asset naming drift (e.g. darwin vs macos, x64 vs amd64).

Related errors


AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12). Data as JSON: /api/errors/fbc7858bad7a73db. Report an issue: GitHub.