From a33c7ea4bfaec35b76e3606d46458c46556eb91e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 9 Jul 2026 05:35:29 +0000 Subject: [PATCH 1/2] Initial plan From 8d60aadb0d1c086378cbe3c9615704cc41464f07 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 9 Jul 2026 05:55:34 +0000 Subject: [PATCH 2/2] fix: avoid generic agent_failure when specific failure category exists Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- actions/setup/js/handle_agent_failure.cjs | 5 +++- .../setup/js/handle_agent_failure.test.cjs | 29 +++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/actions/setup/js/handle_agent_failure.cjs b/actions/setup/js/handle_agent_failure.cjs index becd2131f85..7c29e2baa80 100644 --- a/actions/setup/js/handle_agent_failure.cjs +++ b/actions/setup/js/handle_agent_failure.cjs @@ -252,7 +252,10 @@ function buildFailureMatchCategories(options) { if (options.hasDailyAICExceeded) categories.push("daily_ai_credits_exceeded"); if (options.isAWFFirewallStartupFailed) categories.push("awf_firewall_startup_failed"); - if (options.agentConclusion === "failure" && !options.isTimedOut) { + // Keep agent_failure as the fallback class only when no existing + // specific category already explains the failure cause. + const hasSpecificFailureCategory = categories.length > 0; + if (options.agentConclusion === "failure" && !options.isTimedOut && !hasSpecificFailureCategory) { categories.push("agent_failure"); } diff --git a/actions/setup/js/handle_agent_failure.test.cjs b/actions/setup/js/handle_agent_failure.test.cjs index 4639a54a21e..fca05165ec9 100644 --- a/actions/setup/js/handle_agent_failure.test.cjs +++ b/actions/setup/js/handle_agent_failure.test.cjs @@ -4701,6 +4701,16 @@ describe("handle_agent_failure", () => { expect(categories).toContain("report_incomplete"); }); + it("does not add agent_failure when a specific category already exists", () => { + const categories = buildFailureMatchCategories({ + agentConclusion: "failure", + isTimedOut: false, + hasReportIncomplete: true, + }); + expect(categories).toContain("report_incomplete"); + expect(categories).not.toContain("agent_failure"); + }); + it("returns sorted categories", () => { const categories = buildFailureMatchCategories({ hasMissingSafeOutputs: true, @@ -4727,7 +4737,7 @@ describe("handle_agent_failure", () => { isAWFFirewallStartupFailed: true, }); expect(categories).toContain("awf_firewall_startup_failed"); - expect(categories).toContain("agent_failure"); + expect(categories).not.toContain("agent_failure"); }); it("does not return awf_firewall_startup_failed category when isAWFFirewallStartupFailed is false", () => { @@ -4808,6 +4818,7 @@ describe("handle_agent_failure", () => { delete process.env.GITHUB_WORKSPACE; delete process.env.GH_AW_FAILURE_CATEGORIES_FILTER; delete process.env.GH_AW_FAILURE_EXCLUDED_CATEGORIES_FILTER; + delete process.env.GH_AW_INFERENCE_ACCESS_ERROR; if (tmpDir && fs.existsSync(tmpDir)) { fs.rmSync(tmpDir, { recursive: true, force: true }); @@ -4819,27 +4830,38 @@ describe("handle_agent_failure", () => { name: "include-only filter creates issue when category matches", includeFilter: ["agent_failure"], excludeFilter: null, + extraEnv: {}, shouldCreateIssue: true, }, { name: "include-only filter skips issue when category does not match", includeFilter: ["missing_safe_outputs"], excludeFilter: null, + extraEnv: {}, + shouldCreateIssue: false, + }, + { + name: "include-only filter skips infra-classified failures when only agent_failure is included", + includeFilter: ["agent_failure"], + excludeFilter: null, + extraEnv: { GH_AW_INFERENCE_ACCESS_ERROR: "true" }, shouldCreateIssue: false, }, { name: "exclude-only filter skips issue when category is excluded", includeFilter: null, excludeFilter: ["agent_failure"], + extraEnv: {}, shouldCreateIssue: false, }, { name: "mixed include+exclude filter skips issue when excluded category is present", includeFilter: ["agent_failure"], excludeFilter: ["agent_failure"], + extraEnv: {}, shouldCreateIssue: false, }, - ])("$name", async ({ includeFilter, excludeFilter, shouldCreateIssue }) => { + ])("$name", async ({ includeFilter, excludeFilter, extraEnv, shouldCreateIssue }) => { const { createIssueMock } = setupGithubMock(); if (includeFilter) { process.env.GH_AW_FAILURE_CATEGORIES_FILTER = JSON.stringify(includeFilter); @@ -4847,6 +4869,9 @@ describe("handle_agent_failure", () => { if (excludeFilter) { process.env.GH_AW_FAILURE_EXCLUDED_CATEGORIES_FILTER = JSON.stringify(excludeFilter); } + for (const [key, value] of Object.entries(extraEnv || {})) { + process.env[key] = value; + } await main();