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

  1. Open the failed run in GitHub Actions, fix the failing asset-publish job, and rerun the workflow.
  2. Check for GITHUB_TOKEN permissions issues on the release job (contents: write).
  3. 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

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


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)