From bf333103119c4530a6445cc72f2a64053346c023 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 11 Jun 2026 19:02:39 +0000 Subject: [PATCH] fix: don't skip daily AIC guardrail for label or slash command triggers Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .../js/check_daily_aic_workflow_guardrail.cjs | 27 ++++++++++++-- ...heck_daily_aic_workflow_guardrail.test.cjs | 36 ++++++++++++++++++- 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/actions/setup/js/check_daily_aic_workflow_guardrail.cjs b/actions/setup/js/check_daily_aic_workflow_guardrail.cjs index 834758d1375..4c8c34c250f 100644 --- a/actions/setup/js/check_daily_aic_workflow_guardrail.cjs +++ b/actions/setup/js/check_daily_aic_workflow_guardrail.cjs @@ -55,6 +55,13 @@ function logDailyGuardrail(message, details) { core.info(formatDailyGuardrailLogMessage(message, details)); } +/** + * Event types that indicate a user-initiated slash command trigger. + * When aw_context.event_type is one of these, the workflow was triggered by a user + * typing a slash command in a comment, and the daily guardrail should not be skipped. + */ +const SLASH_COMMAND_EVENT_TYPES = ["issue_comment", "pull_request_review_comment", "discussion_comment"]; + /** * @returns {boolean} */ @@ -62,8 +69,24 @@ function shouldSkipDailyAICGuardrail() { const eventName = process.env.GITHUB_EVENT_NAME || ""; const isWorkflowCall = eventName === "workflow_call"; const isRepositoryDispatch = eventName === "repository_dispatch"; - const hasDispatchContext = (process.env.GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT || "").trim() !== ""; - return isWorkflowCall || isRepositoryDispatch || (eventName === "workflow_dispatch" && hasDispatchContext); + const rawContext = (process.env.GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT || "").trim(); + const hasDispatchContext = rawContext !== ""; + if (!(isWorkflowCall || isRepositoryDispatch || (eventName === "workflow_dispatch" && hasDispatchContext))) { + return false; + } + if (eventName === "workflow_dispatch" && hasDispatchContext) { + try { + const awContext = JSON.parse(rawContext); + const isLabelCommand = typeof awContext.trigger_label === "string" && awContext.trigger_label.trim() !== ""; + const isSlashCommand = SLASH_COMMAND_EVENT_TYPES.includes(awContext.event_type); + if (isLabelCommand || isSlashCommand) { + return false; + } + } catch { + // Malformed aw_context: fall through and skip as before. + } + } + return true; } /** diff --git a/actions/setup/js/check_daily_aic_workflow_guardrail.test.cjs b/actions/setup/js/check_daily_aic_workflow_guardrail.test.cjs index 67f0aca4bf2..32d66b280ef 100644 --- a/actions/setup/js/check_daily_aic_workflow_guardrail.test.cjs +++ b/actions/setup/js/check_daily_aic_workflow_guardrail.test.cjs @@ -27,13 +27,47 @@ describe("check_daily_aic_workflow_guardrail", () => { expect(exports.shouldSkipDailyAICGuardrail()).toBe(true); process.env.GITHUB_EVENT_NAME = "workflow_dispatch"; - process.env.GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT = '{"item_number":123}'; + process.env.GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT = '{"event_type":"schedule"}'; + expect(exports.shouldSkipDailyAICGuardrail()).toBe(true); + + process.env.GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT = '{"event_type":"workflow_dispatch"}'; expect(exports.shouldSkipDailyAICGuardrail()).toBe(true); process.env.GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT = ""; expect(exports.shouldSkipDailyAICGuardrail()).toBe(false); }); + it("does not skip for label command triggers in aw_context", () => { + process.env.GITHUB_EVENT_NAME = "workflow_dispatch"; + process.env.GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT = '{"event_type":"pull_request","trigger_label":"smoke"}'; + expect(exports.shouldSkipDailyAICGuardrail()).toBe(false); + + process.env.GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT = '{"event_type":"issues","trigger_label":"ci-doctor"}'; + expect(exports.shouldSkipDailyAICGuardrail()).toBe(false); + }); + + it("does not skip for slash command triggers in aw_context", () => { + process.env.GITHUB_EVENT_NAME = "workflow_dispatch"; + process.env.GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT = '{"event_type":"issue_comment","trigger_label":""}'; + expect(exports.shouldSkipDailyAICGuardrail()).toBe(false); + + process.env.GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT = '{"event_type":"pull_request_review_comment"}'; + expect(exports.shouldSkipDailyAICGuardrail()).toBe(false); + + process.env.GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT = '{"event_type":"discussion_comment"}'; + expect(exports.shouldSkipDailyAICGuardrail()).toBe(false); + }); + + it("skips for workflow_dispatch with aw_context that has no trigger_label and non-slash event_type", () => { + process.env.GITHUB_EVENT_NAME = "workflow_dispatch"; + process.env.GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT = '{"event_type":"push","trigger_label":""}'; + expect(exports.shouldSkipDailyAICGuardrail()).toBe(true); + + // Malformed JSON should still skip (safe fallback) + process.env.GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT = "not-json"; + expect(exports.shouldSkipDailyAICGuardrail()).toBe(true); + }); + it("matches usage artifacts only", () => { expect(exports.matchesGuardrailArtifactName("usage")).toBe(true); expect(exports.matchesGuardrailArtifactName("prefix-usage")).toBe(true);