{"record":{"id":"dcdc9807cd5a6b03","repo":"Foundry376/Mailspring","slug":"grammar-check-service-is-temporarily-unavailable","errorCode":null,"errorMessage":"Grammar check service is temporarily unavailable.","messagePattern":"Grammar check service is temporarily unavailable\\.","errorType":"http","errorClass":null,"httpStatus":502,"severity":"error","filePath":"app/internal_packages/composer-grammar-check/lib/grammar-check-service.ts","lineNumber":143,"sourceCode":"        json: true,\n        body: {\n          messageId,\n          text,\n          language: language || this.language,\n        },\n      });\n    } catch (err) {\n      // 400 = quota reached (\"Quota Reached\")\n      if (err.statusCode === 400) {\n        throw new UsageExceededError();\n      }\n      // 429 = rate limited — surface as a transient error, caller will retry on next dirty check\n      if (err.statusCode === 429) {\n        throw new Error('Grammar check rate limit reached, please try again shortly.');\n      }\n      // 502 = LanguageTool backend unavailable\n      if (err.statusCode === 502) {\n        throw new Error('Grammar check service is temporarily unavailable.');\n      }\n      throw err;\n    }\n\n    const filtered = data.matches.filter((match) => match.rule.issueType !== 'misspelling');\n\n    return filtered.map((match) => ({\n      offset: match.offset,\n      length: match.length,\n      message: match.message,\n      shortMessage: match.shortMessage || '',\n      replacements: match.replacements.map((r) => r.value),\n      ruleId: match.rule.id,\n      ruleDescription: match.rule.description,\n      category: match.rule.category.id,\n      categoryName: match.rule.category.name,\n      issueType: match.rule.issueType,\n      sentence: match.sentence,","sourceCodeStart":125,"sourceCodeEnd":161,"githubUrl":"https://github.com/Foundry376/Mailspring/blob/648c685d602ece6bb00c22534b8734de6ac644b3/app/internal_packages/composer-grammar-check/lib/grammar-check-service.ts#L125-L161","documentation":"Thrown when the identity backend proxies to the LanguageTool service and gets HTTP 502 back, i.e. the upstream grammar backend is down or unreachable. Signals a server-side outage, not a problem with the user's text or account.","triggerScenarios":"Thrown at app/internal_packages/composer-grammar-check/lib/grammar-check-service.ts:143 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Retry the check after a delay; 502 is typically transient","Disable or grey out grammar checking until the service responds successfully to avoid repeated errors"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"648c685d602ece6bb00c22534b8734de6ac644b3","analyzedAt":"2026-09-03T02:00:24.311Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T07:17:11.731Z"}