moeru-ai/airi · warning · Error

Failed to fetch GitHub releases atom (${atomResponse.status}

Error message

Failed to fetch GitHub releases atom (${atomResponse.status} ${atomResponse.statusText})

What it means

Thrown in resolveGitHubReleaseTagForLane when the releases.atom fallback fetch returns a non-ok HTTP status. This is the second-stage fallback after the primary GitHub releases JSON API already failed (its failure was caught and warned). The atom feed is the last resort for auto-update tag resolution.

Source

Thrown at apps/stage-tamagotchi/src/main/services/electron/auto-updater.ts:433

      if (!response.ok)
        throw new Error(`Failed to fetch GitHub releases (${response.status} ${response.statusText})`)

      const payload = await response.json()
      if (!Array.isArray(payload))
        throw new Error('Unexpected GitHub releases payload shape')

      const tag = selectLatestTagForLane(payload as GitHubReleaseRecord[], lane)
      if (tag)
        return tag
    }
    catch (error) {
      log.withError(error).warn('GitHub releases API lookup failed, trying releases.atom fallback')
    }

    const atomResponse = await fetch(GITHUB_RELEASES_ATOM_URL)
    if (!atomResponse.ok)
      throw new Error(`Failed to fetch GitHub releases atom (${atomResponse.status} ${atomResponse.statusText})`)

    const atom = await atomResponse.text()
    const releasesFromAtom = extractReleaseTagsFromAtom(atom).map(tag => ({ tag_name: tag }))
    const tag = selectLatestTagForLane(releasesFromAtom, lane)
    if (!tag)
      throw new Error(`No GitHub release found for update lane "${lane}"`)

    return tag
  }

  async function prepareGitHubGenericFeed() {
    if (activeFeedUrlOverride)
      return
    if (resolvedReleaseTag)
      return
    if (prepareFeedPromise) {
      await prepareFeedPromise
      return

View on GitHub (pinned to 27111382b4)

Solutions

  1. Check connectivity to github.com and whether a proxy/firewall blocks the atom feed.
  2. Wait if rate-limited — GitHub unauthenticated allowance resets hourly; authenticate requests if a token is available.
  3. Run the update check later during a GitHub platform incident.
  4. Verify GITHUB_RELEASES_ATOM_URL still resolves to the active releases feed.
Defensive patterns

Strategy: try-catch

Try / catch

try {
  await resolveGitHubReleaseTagForLane(lane)
} catch (e) {
  log.warn('Auto-update tag resolution unavailable, skipping update check', e)
  // non-fatal — update checks are best-effort
}

Prevention

When it happens

Trigger: GitHub is rate-limiting the client (unauthenticated requests), GitHub is down, the network proxy blocks github.com, or the atom URL constant is stale. Both the API and atom endpoints must fail for this to surface — a single endpoint failure is swallowed.

Common situations: CI or dev machine behind a corporate proxy; exceeded GitHub unauthenticated rate limit (60/hr); offline dev; GitHub incident; GITHUB_RELEASES_ATOM_URL points to a relocated feed.

Related errors


AI-assisted analysis of moeru-ai/airi@27111382b4 (2026-08-12). Data as JSON: /api/errors/f8f5811709b24806. Report an issue: GitHub.