Hmbown/CodeWhale · error · Error
No successful asset-publishing job found in release.yml…
Error message
No successful asset-publishing job found in release.yml workflow runs for ${tag} at ${tagSha}. Repair the Release workflow before publishing npm. What it means
When candidate release.yml runs exist for the tag/SHA but none contains a successful job that published assets, findReleaseWorkflowRun throws this error instructing you to repair the Release workflow before publishing npm.
Solutions
- Open the failed run in GitHub Actions, fix the failing asset-publish job, and rerun the workflow.
- Check for GITHUB_TOKEN permissions issues on the release job (contents: write).
- Verify job/step names and job.step conclusions still match what the verifier treats as an asset-publishing job.
Example fix
// .github/workflows/release.yml
// before
permissions: { contents: read }
// after
permissions: { contents: write } Defensive patterns
Strategy: retry
Validate before calling
const run = matchingRuns.find(r => r.conclusion === "success"); if (!run) throw new Error("Release run for tag is not successful; fix workflow before publishing"); Try / catch
try { await verifyReleaseAssets(); } catch (e) { if (e.message.includes("No successful asset-publishing job")) { console.error("Inspect the release.yml run logs, repair, and rerun."); process.exit(1); } throw e; } Prevention
- Require green release.yml runs in CI before publish jobs
- Grant the release job contents:write permissions
- Watch for concurrency cancellations that kill asset upload jobs
When it happens
Trigger: Runs matching the tag exist but every one has failed/skipped asset-publishing jobs, so no successful job baseline can be attached to the release assets.
Common situations: Release workflow failing on asset upload (permissions, artifact name changes); workflow marked failed due to an unrelated matrix job; concurrency cancellations killing the job.
Understand the failure class
Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.
Related errors
- No release.yml workflow run found for
- Downloaded release artifacts are missing
- npm package version does not match codewhaleBinaryVersion …
- A full Git history is required to establish the PR merge…
- account_agent_model_unconfigured
AI-assisted analysis of Hmbown/CodeWhale@433685b202 (2026-09-15).
Data as JSON: /api/errors/d2d7e4be9f514123.
Report an issue: GitHub.
Appendix: source
Thrown at npm/codewhale/scripts/verify-release-assets.js:252
const releaseJob = (jobs.jobs || []).find(
(job) => job.name === "release" && job.conclusion === "success",
);
if (releaseJob) {
// #5429: pin asset freshness to the successful release job's own
// started_at, not the run-level run_started_at. A job-level rerun
// (`gh run rerun --failed`) bumps run_started_at past the asset upload
// timestamps even though this release job produced those assets.
return { ...candidate, release_job_started_at: releaseJob.started_at || null };
}
}
if (orderedCandidates.length === 0) {
throw new Error(
`No release.yml workflow run found for ${tag} at ${tagSha}. ` +
"Rerun the Release workflow before publishing npm, or increase the verifier's last-100-runs search window.",
);
}
throw new Error(
`No successful asset-publishing job found in release.yml workflow runs for ${tag} at ${tagSha}. ` +
"Repair the Release workflow before publishing npm.",
);
}
function parseGitHubTime(value, label) {
const timestamp = Date.parse(value);
if (!Number.isFinite(timestamp)) {
throw new Error(`GitHub ${label} timestamp is invalid: ${value}`);
}
return timestamp;
}
function assertReleaseAssetsFresh(release, expectedAssets, run) {
const assetsByName = new Map((release.assets || []).map((asset) => [asset.name, asset]));
const missing = expectedAssets.filter((asset) => !assetsByName.has(asset));
if (missing.length > 0) {
throw new Error(`GitHub Release is missing required release asset(s): ${missing.join(", ")}`);View on GitHub (pinned to 433685b202)