{"record":{"id":"83a3ed2b86a6dd7f","repo":"moeru-ai/airi","slug":"no-github-release-found-for-update-lane-lane","errorCode":null,"errorMessage":"No GitHub release found for update lane \"${lane}\"","messagePattern":"No GitHub release found for update lane \"(.+?)\"","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"warning","filePath":"apps/stage-tamagotchi/src/main/services/electron/auto-updater.ts","lineNumber":439,"sourceCode":"        throw new Error('Unexpected GitHub releases payload shape')\n\n      const tag = selectLatestTagForLane(payload as GitHubReleaseRecord[], lane)\n      if (tag)\n        return tag\n    }\n    catch (error) {\n      log.withError(error).warn('GitHub releases API lookup failed, trying releases.atom fallback')\n    }\n\n    const atomResponse = await fetch(GITHUB_RELEASES_ATOM_URL)\n    if (!atomResponse.ok)\n      throw new Error(`Failed to fetch GitHub releases atom (${atomResponse.status} ${atomResponse.statusText})`)\n\n    const atom = await atomResponse.text()\n    const releasesFromAtom = extractReleaseTagsFromAtom(atom).map(tag => ({ tag_name: tag }))\n    const tag = selectLatestTagForLane(releasesFromAtom, lane)\n    if (!tag)\n      throw new Error(`No GitHub release found for update lane \"${lane}\"`)\n\n    return tag\n  }\n\n  async function prepareGitHubGenericFeed() {\n    if (activeFeedUrlOverride)\n      return\n    if (resolvedReleaseTag)\n      return\n    if (prepareFeedPromise) {\n      await prepareFeedPromise\n      return\n    }\n\n    prepareFeedPromise = (async () => {\n      const preferredLane = getPreferredUpdateLane({ version: appVersion, storedLane: storedPreferredLane })\n      const tag = await resolveGitHubReleaseTagForLane(preferredLane)\n      resolvedReleaseTag = tag","sourceCodeStart":421,"sourceCodeEnd":457,"githubUrl":"https://github.com/moeru-ai/airi/blob/27111382b4a79a7e983289d6e983a06af185ed0f/apps/stage-tamagotchi/src/main/services/electron/auto-updater.ts#L421-L457","documentation":"Thrown when the releases.atom fallback succeeded and was parsed, but selectLatestTagForLane returned no matching tag for the requested update lane. Neither the JSON API nor the atom feed contained a release tag matching the lane filter (e.g. stable, beta).","triggerScenarios":"The configured update lane (channel) has no published releases — e.g. user selected a 'beta' lane but only stable tags exist; tag naming convention changed so the lane matcher no longer recognizes them; the repo has zero published GitHub releases.","commonSituations":"Misconfigured update channel in settings; lane filter regex/selectLatestTagForLane is out of sync with the project's tag naming convention; fresh fork with no releases; user on an exotic lane with no matching release.","solutions":["Switch the update lane/channel to one that has published releases (typically 'stable').","Confirm the repo has GitHub releases published and that their tag names match selectLatestTagForLane's expected pattern.","Update selectLatestTagForLane if the project's tag naming convention changed.","If self-hosting, publish a release tagged for the target lane."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"import { selectLatestTagForLane } from './auto-updater'\n// Before committing to a lane, verify at least one release matches:\nconst candidate = selectLatestTagForLane(allReleases, desiredLane)\nif (!candidate) {\n  // fall back to a lane known to have releases, or disable auto-update\n}","typeGuard":null,"tryCatchPattern":"try {\n  await resolveGitHubReleaseTagForLane(lane)\n} catch (e) {\n  if (e instanceof Error && e.message.includes('No GitHub release found')) {\n    // fall back to stable lane or disable update notifications\n  } else throw e\n}","preventionTips":["Default users to the 'stable' lane which always has releases.","Keep selectLatestTagForLane in sync with the project tag convention.","Surface a clear 'no update available for this channel' message instead of an error."],"tags":["auto-updater","github","configuration","release-channel"],"backgroundTag":null,"analyzedSha":"27111382b4a79a7e983289d6e983a06af185ed0f","analyzedAt":"2026-08-12T18:33:34.132Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}