{"record":{"id":"6b771845b153d1f4","repo":"mastra-ai/mastra","slug":"unsupported-github-review-state-state","errorCode":null,"errorMessage":"Unsupported GitHub review state: ${state}","messagePattern":"Unsupported GitHub review state: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"mastracode/factory/src/integrations/github/integration.ts","lineNumber":1459,"sourceCode":"function parseRequestedReviewers(data: {\n  users?: Array<{ login?: string }> | null;\n  teams?: Array<{ slug?: string }> | null;\n  requested_reviewers?: Array<{ login?: string }> | null;\n  requested_teams?: Array<{ slug?: string }> | null;\n}) {\n  return {\n    users: (data.users ?? data.requested_reviewers ?? []).flatMap(user => (user.login ? [user.login] : [])),\n    teams: (data.teams ?? data.requested_teams ?? []).flatMap(team => (team.slug ? [team.slug] : [])),\n  };\n}\n\nfunction parseReviewState(state: string): Review['state'] {\n  if (state === 'PENDING') return 'pending';\n  if (state === 'COMMENTED') return 'commented';\n  if (state === 'APPROVED') return 'approved';\n  if (state === 'CHANGES_REQUESTED') return 'changes-requested';\n  if (state === 'DISMISSED') return 'dismissed';\n  throw new Error(`Unsupported GitHub review state: ${state}`);\n}\n\nfunction reviewEventToGithub(event: Exclude<InputOf<'createReview'>['event'], undefined>) {\n  if (event === 'approve') return 'APPROVE' as const;\n  if (event === 'request-changes') return 'REQUEST_CHANGES' as const;\n  return 'COMMENT' as const;\n}\n\nfunction requirePullRequestNumber(value: string): number {\n  return requirePositiveId(value, 'pull request');\n}\n\nfunction requirePositiveId(value: string, resource: string): number {\n  const parsed = parsePositiveInteger(value);\n  if (parsed === null) throw new Error(`GitHub ${resource} id must be a positive integer.`);\n  return parsed;\n}\n","sourceCodeStart":1441,"sourceCodeEnd":1477,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/mastracode/factory/src/integrations/github/integration.ts#L1441-L1477","documentation":"parseReviewState maps GitHub's uppercase review state strings onto the library's Review['state'] union. Any state string outside the five known GitHub values (PENDING, COMMENTED, APPROVED, CHANGES_REQUESTED, DISMISSED) is rejected, meaning GitHub introduced a new state or the caller passed an already-lowercased/invalid value.","triggerScenarios":"Fetching PR reviews while passing a custom state string; GitHub API returning an unexpected new state value; feeding lowercase 'approved' into parseReviewState instead of the raw API value.","commonSituations":"Caching review states and re-parsing stored (normalized) values; a GitHub API change adding a state; passing review.submitted state from a different API shape.","solutions":["Pass the raw uppercase state from the GitHub API, not a normalized value.","Log the offending state value and check the GitHub REST API docs for new states.","Add a mapping branch for any newly documented state.","Map unknown states to a fallback like 'commented' only if your logic tolerates it — better to update the parser."],"exampleFix":"// before\nparseReviewState(review.state.toLowerCase());\n// after\nparseReviewState(review.state); // pass raw API value, e.g. 'CHANGES_REQUESTED'","handlingStrategy":"validation","validationCode":"const KNOWN = ['PENDING','COMMENTED','APPROVED','CHANGES_REQUESTED','DISMISSED'] as const;\nif (!(KNOWN as readonly string[]).includes(state)) throw new Error(`unknown review state: ${state}`);","typeGuard":"function isGithubReviewState(s: string): s is 'PENDING'|'COMMENTED'|'APPROVED'|'CHANGES_REQUESTED'|'DISMISSED' {\n  return ['PENDING','COMMENTED','APPROVED','CHANGES_REQUESTED','DISMISSED'].includes(s);\n}","tryCatchPattern":"try {\n  return parseReviewState(rawState);\n} catch (e) {\n  log.warn('unknown review state', { rawState });\n  return 'commented' as Review['state']; // or rethrow, per policy\n}","preventionTips":["Pass raw uppercase GitHub API values straight into the parser.","Keep a mapping table checked against current GitHub REST docs.","Don't cache normalized states and re-run them through the parser."],"tags":["github","parsing","enum"],"backgroundTag":"unexpected-enum-value","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}