{"record":{"id":"3243fcda01984732","repo":"affaan-m/ECC","slug":"discussion-is-not-an-announcement","errorCode":null,"errorMessage":"discussion is not an Announcement","messagePattern":"discussion is not an Announcement","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"scripts/discord/release-announce.mjs","lineNumber":85,"sourceCode":"    const discussions = pageData.repository.discussions;\n    existing = findReleaseDiscussion(discussions.nodes, marker);\n    if (!discussions.pageInfo.hasNextPage) break;\n    cursor = discussions.pageInfo.endCursor;\n  }\n  if (existing) return existing;\n  const category = repository.discussionCategories.nodes.find(item => item.name === 'Announcements');\n  if (!category) throw new Error('Announcements discussion category is required');\n  const title = `${release.name || release.tag_name} release`;\n  const body = [marker, release.body || '', `Release: ${release.html_url}`].filter(Boolean).join('\\n\\n');\n  const created = await githubGraphql(\n    `mutation($repo:ID!,$cat:ID!,$title:String!,$body:String!){createDiscussion(input:{repositoryId:$repo,categoryId:$cat,title:$title,body:$body}){discussion{id title body url category{name}}}}`,\n    { repo: repository.id, cat: category.id, title, body },\n  );\n  return created.createDiscussion.discussion;\n}\n\nfunction discussionFromEnvironment() {\n  if (env.DISCUSSION_CATEGORY !== 'Announcements') throw new Error('discussion is not an Announcement');\n  return {\n    id: env.DISCUSSION_ID,\n    title: env.DISCUSSION_TITLE,\n    body: env.DISCUSSION_BODY,\n    url: env.DISCUSSION_URL,\n  };\n}\n\nasync function discussionFromGitHub() {\n  if (!/^\\d+$/.test(env.DISCUSSION_NUMBER || '')) throw new Error('discussion number is invalid');\n  const response = await request(`https://api.github.com/repos/${env.GITHUB_REPOSITORY}/discussions/${env.DISCUSSION_NUMBER}`, {\n    headers: { Authorization: `Bearer ${env.GITHUB_TOKEN}`, Accept: 'application/vnd.github+json' },\n  });\n  if (!response.ok) throw new Error(`discussion lookup failed (${response.status})`);\n  const discussion = await response.json();\n  if (discussion.category?.name !== 'Announcements') throw new Error('discussion is not an Announcement');\n  return { id: discussion.node_id, title: discussion.title, body: discussion.body, url: discussion.html_url };\n}","sourceCodeStart":67,"sourceCodeEnd":103,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/scripts/discord/release-announce.mjs#L67-L103","documentation":"discussionFromEnvironment builds the discussion object purely from workflow-provided env vars, but only permits use when DISCUSSION_CATEGORY is exactly 'Announcements'. The throw enforces that the injected discussion actually lives in the Announcements category, since the script only posts receipts into announcements.","triggerScenarios":"Env-provided path selected (DISCUSSION_ID etc. present) but DISCUSSION_CATEGORY env var holds any other value — e.g. 'General', 'Ideas', unset-and-defaulted, or differently cased like 'announcements'.","commonSituations":"Workflow step wired with DISCUSSION_ID/DISCUSSION_TITLE but forgot to pass DISCUSSION_CATEGORY; CI passes the category of an existing discussion that lives in a non-announcement category; case sensitivity mismatch.","solutions":["Set DISCUSSION_CATEGORY=Announcements in the workflow env","Move the target discussion into the Announcements category","Use the GitHub-lookup path instead by passing DISCUSSION_NUMBER for a discussion already in Announcements","Trim/case-normalize the comparison if upstream providers vary the value"],"exampleFix":"// before\nif (env.DISCUSSION_CATEGORY !== 'Announcements') throw new Error('discussion is not an Announcement');\n// after\nif (env.DISCUSSION_CATEGORY?.trim() !== 'Announcements') throw new Error(`discussion is not an Announcement (got: ${env.DISCUSSION_CATEGORY})`);","handlingStrategy":"validation","validationCode":"// guard in the workflow before the script runs\nif (process.env.DISCUSSION_CATEGORY !== 'Announcements') {\n  throw new Error(`DISCUSSION_CATEGORY must be 'Announcements', got: ${process.env.DISCUSSION_CATEGORY}`);\n}","typeGuard":"function isAnnouncementEnv(env) {\n  return env.DISCUSSION_CATEGORY === 'Announcements'\n    && typeof env.DISCUSSION_ID === 'string' && env.DISCUSSION_ID.length > 0;\n}","tryCatchPattern":"try {\n  const discussion = discussionFromEnvironment();\n} catch (err) {\n  if (err.message === 'discussion is not an Announcement') {\n    console.error(`DISCUSSION_CATEGORY=${process.env.DISCUSSION_CATEGORY}; expected 'Announcements'`);\n  }\n  throw err;\n}","preventionTips":["Always set DISCUSSION_CATEGORY=Announcements in the workflow env block","Prefer the DISCUSSION_NUMBER lookup path so category is verified against GitHub directly","Trim and case-normalize env values before comparison","Document required env vars in action.yml / workflow comments"],"tags":["environment","configuration","discussions"],"backgroundTag":"invalid-env-var-value","analyzedSha":"8321021c54d670126ce3b2969d5deb880b4b0c2a","analyzedAt":"2026-09-16T10:08:13.343Z","contentChangedAt":"2026-09-16T10:08:13.343Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}