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
returnView on GitHub (pinned to 27111382b4)
Solutions
- Check connectivity to github.com and whether a proxy/firewall blocks the atom feed.
- Wait if rate-limited — GitHub unauthenticated allowance resets hourly; authenticate requests if a token is available.
- Run the update check later during a GitHub platform incident.
- 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
- Treat update-check failures as non-fatal (warn, don't crash).
- Authenticate GitHub requests when possible to avoid rate limits.
- Cache the last-known release tag so a transient failure doesn't block the app.
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
- No GitHub release found for update lane "${lane}"
- Geocoding request failed: ${res.status}
- Weather request failed: ${res.status}
- No candidate server channel URL was reachable. ${errors.join
- Token exchange failed (${response.status}): ${text}
AI-assisted analysis of moeru-ai/airi@27111382b4 (2026-08-12).
Data as JSON: /api/errors/f8f5811709b24806.
Report an issue: GitHub.