Skip to content

[q] CI Failure Doctor: Automatic cleanup of expired issues #14397

@github-actions

Description

@github-actions

Summary

Updates the CI Failure Doctor workflow to automatically close expired investigation issues, keeping the issue tracker clean and current.

Context

Issue #14387 requested that the CI Failure Doctor workflow close older/expired issues automatically. Currently, CI Failure Doctor creates issues with a 1-day expiry (expires: 1d), but there was no cleanup mechanism to close these issues after expiration.

Example of stale issue: Issue #14239 was created on Feb 6, 2026, 10:50 PM UTC with an expiry of Feb 7, 2026, 10:50 PM UTC, but remained open past its expiry date.

Changes Made

1. Added close-issue to safe-outputs

safe-outputs:
  create-issue:
    expires: 1d
    title-prefix: "[CI Failure Doctor] "
    labels: [cookie]
  add-comment:
  close-issue:  # NEW
  noop:

2. Updated permissions

Changed issues: readissues: write to allow closing issues via safe-outputs.

3. Added cleanup phase to investigation protocol

New Phase 1, Step 2 closes expired issues before creating new ones:

  • Searches for open "[CI Failure Doctor]" issues
  • Parses expiry markers in issue bodies (e.g., ``)
  • Uses close_issue tool to close expired issues with a diagnostic message
  • Ensures issue tracker only shows recent failures

Expected Improvements

  • ✅ Automatic cleanup of stale CI investigation issues
  • ✅ Issue tracker shows only recent (≤1 day old) CI failures
  • ✅ Reduces manual triage burden for maintainers
  • ✅ Maintains clean signal-to-noise ratio in issues

Validation

Changes follow the established pattern:

  • Uses safe-outputs close_issue tool (already implemented in actions/setup/js/close_issue.cjs)
  • Follows workflow conventions for permissions and safe-outputs configuration
  • Adds cleanup instructions to Phase 1 (before new issue creation)
  • Updates Important Guidelines to emphasize cleanup responsibility

References

Note: .lock.yml file will be compiled automatically after merge.

AI generated by Q

  • expires on Feb 9, 2026, 5:09 PM UTC

Note

This was originally intended as a pull request, but the git push operation failed.

Workflow Run: View run details and download patch artifact

The patch file is available in the agent-artifacts artifact in the workflow run linked above.

To apply the patch locally:

# Download the artifact from the workflow run https://github.com/github/gh-aw/actions/runs/21783644413
# (Use GitHub MCP tools if gh CLI is not available)
gh run download 21783644413 -n agent-artifacts

# The patch file will be at agent-artifacts/tmp/gh-aw/aw.patch after download
# Apply the patch
git am agent-artifacts/tmp/gh-aw/aw.patch
Show patch preview (65 of 65 lines)
From f7968b0a50d48f642fcb425d16c84853d4c2de98 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]" <github-actions[bot]@users.noreply.github.com>
Date: Sat, 7 Feb 2026 17:07:36 +0000
Subject: [PATCH] feat(ci-doctor): add automatic cleanup of expired issues

- Add close-issue to safe-outputs configuration
- Update permissions from issues:read to issues:write
- Add Phase 1 step to close expired CI Failure Doctor issues before creating new ones
- Issues are closed automatically when their 1-day expiry window has passed
- Closes #14387
---
 .github/workflows/ci-doctor.md | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/ci-doctor.md b/.github/workflows/ci-doctor.md
index afd256a..435a9a7 100644
--- a/.github/workflows/ci-doctor.md
+++ b/.github/workflows/ci-doctor.md
@@ -17,7 +17,7 @@ if: ${{ github.event.workflow_run.conclusion == 'failure' }}
 permissions:
   actions: read        # To query workflow runs, jobs, and logs
   contents: read       # To read repository files
-  issues: read         # To search and analyze issues
+  issues: write        # To create, update, and close issues
   pull-requests: read  # To analyze pull request context
 
 network: defaults
@@ -32,6 +32,7 @@ safe-outputs:
     title-prefix: "[CI Failure Doctor] "
     labels: [cookie]
   add-comment:
+  close-issue:
   noop:
   messages:
     footer: "> 🩺 *Diagnosis provided by [{workflow_name}]({run_url})*"
@@ -72,9 +73,14 @@ You are the CI Failure Doctor, an expert investigative agent that analyzes faile
 1. **Verify Failure**: Check that `${{ github.event.workflow_run.conclusion }}` is `failure` or `cancelled`
    - **If the workflow was successful**: Call the `noop` tool with message "CI workflow completed successfully - no investigation needed" and **stop immediately**. Do not proceed with any further analysis.
    - **If the workflow failed or was cancelled**: Proceed with the investigation steps below.
-2. **Get Workflow Details**: Use 
... (truncated)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions