{"record":{"id":"f4cc979436527e7e","repo":"vuejs/core","slug":"ci-for-the-latest-commit-has-not-passed-yet-only","errorCode":null,"errorMessage":"CI for the latest commit has not passed yet. Only run the release workflow after the CI has passed.","messagePattern":"CI for the latest commit has not passed yet\\. Only run the release workflow after the CI has passed\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"scripts/release.js","lineNumber":300,"sourceCode":"  if (!skipTests) {\n    step('Checking CI status for HEAD...')\n    let isCIPassed = await getCIResult()\n    skipTests ||= isCIPassed\n\n    if (isCIPassed) {\n      if (!skipPrompts) {\n        /** @type {{ yes: boolean }} */\n        const { yes: promptSkipTests } = await prompt({\n          type: 'confirm',\n          name: 'yes',\n          message: `CI for this commit passed. Skip local tests?`,\n        })\n        skipTests = promptSkipTests\n      } else {\n        skipTests = true\n      }\n    } else if (skipPrompts) {\n      throw new Error(\n        'CI for the latest commit has not passed yet. ' +\n          'Only run the release workflow after the CI has passed.',\n      )\n    }\n  }\n\n  if (!skipTests) {\n    step('\\nRunning tests...')\n    if (!isDryRun) {\n      await run('pnpm', ['run', 'test', '--run'])\n    } else {\n      console.log(`Skipped (dry run)`)\n    }\n  } else {\n    step('Tests skipped.')\n  }\n}\n","sourceCodeStart":282,"sourceCodeEnd":318,"githubUrl":"https://github.com/vuejs/core/blob/a2b40db9a83b36ed9da3a16403cf8f040262d73f/scripts/release.js#L282-L318","documentation":"Thrown by Vue's release script when run with skipPrompts (non-interactive) and CI for the latest commit has NOT passed. The script checks CI status; in interactive mode it would offer to run local tests, but in skipPrompts mode a failing/unknown CI is a hard stop. release.js:300 refuses to release an unverified commit.","triggerScenarios":"Running `node scripts/release.js <ver> --skipPrompts` (or in CI) when the GitHub CI check for HEAD is pending, failed, or not found. Triggering an automated release before the build workflow finishes.","commonSituations":"An automated release job firing on push before CI completes; a CI workflow that reports failure; CI status API returning no successful run for the commit; network/GitHub-API issue making CI status unreadable so it is treated as not-passed.","solutions":["Wait for CI on the latest commit to pass, then re-run the release.","Run the release interactively (without skipPrompts) so it can offer to run local tests as an alternative.","If CI is genuinely green but the status check is misread, verify the CI workflow name and required-status context match what release.js queries.","Re-trigger CI on the commit and only release once it reports success."],"exampleFix":"# before\nnode scripts/release.js patch --skipPrompts  # CI not green yet\n\n# after — wait, then run\n# (after CI shows green on HEAD)\nnode scripts/release.js patch --skipPrompts","handlingStrategy":"validation","validationCode":"// (Vue release maintainers only) check CI status before a skipPrompts release.\nasync function ciPassedForHEAD() {\n  // query the same status context release.js uses\n  return await getLatestCIStatus(headSHA)\n}\nif (skipPrompts && !(await ciPassedForHEAD())) {\n  throw new Error('CI not green on HEAD; do not release yet.')\n}","typeGuard":"function ciStatusIsSuccess(status: string): boolean {\n  return status === 'success'\n}","tryCatchPattern":null,"preventionTips":["Only run skipPrompts releases after CI on HEAD reports success.","Run interactively so the script can offer local tests as a fallback.","Ensure the CI workflow name matches what release.js queries as a required status."],"tags":["vue","release-script","ci","internal-scripts","automation"],"backgroundTag":null,"analyzedSha":"a2b40db9a83b36ed9da3a16403cf8f040262d73f","analyzedAt":"2026-08-12T14:21:14.989Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}