Skip to content

[aw] PR Code Quality Reviewer failed #50657

Closed as not planned
Closed as not planned

Description

@github-actions

Workflow Failure

Workflow: PR Code Quality Reviewer
Branch: copilot/re-add-merge-ours-to-gitattributes
Run: https://github.com/github/gh-aw/actions/runs/31030978505
Pull Request: #50639

Warning

Engine Failure: The copilot engine terminated unexpectedly.

Last agent output:

{"type":"tool.execution_start","timestamp":"2026-08-05T17:45:46.875Z","data":{"toolName":"bash","mcpServerName":"","command":"grep -n \"Legacy\\|trimmedLine ==\" /home/runner/work/gh-aw/gh-aw/pkg/cli/git.go"}}
{"type":"tool.execution_complete","timestamp":"2026-08-05T17:45:46.939Z","data":{"toolName":"bash","mcpServerName":"","success":true,"result":{"content":"374:\t\t\tif trimmedLine == required {\n381:\t\t\tif trimmedLine == constants.WorkflowsLockYmlGitAttributesEntryLegacy && required == lockYmlEntry {\n<shellId: 12 completed with exit code 0>","detailedContent":"374:\t\t\tif trimmedLine == required {\n381:\t\t\tif trimmedLine == constants.WorkflowsLockYmlGitAttributesEntryLegacy && required == lockYmlEntry {\n<shellId: 12 completed with exit code 0>"}}}
{"type":"assistant.message","timestamp":"2026-08-05T17:46:04.859Z","data":{"content":""}}
{"type":"tool.execution_start","timestamp":"2026-08-05T17:46:04.862Z","data":{"toolName":"bash","mcpServerName":"","command":"sed -n '1,110p' /home/runner/work/gh-aw/gh-aw/pkg/cli/gitattributes_test.go"}}
{"type":"tool.execution_complete","timestamp":"2026-08-05T17:46:04.935Z","data":{"toolName":"bash","mcpServerName":"","success":true,"result":{"content":"//go:build !integration\n\npackage cli\n\nimport (\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestEnsureGitAttributes(t *testing.T) {\n\t// Create a temporary directory for testing\n\ttmpDir, err := os.MkdirTemp(\"\", \"gh-aw-gitattributes-test\")\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create temp dir: %v\", err)\n\t}\n\tdefer os.RemoveAll(tmpDir)\n\n\t// Change to temp directory\n\toriginalDir, err := os.Getwd()\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to get current directory: %v\", err)\n\t}\n\tdefer func() {\n\t\t_ = os.Chdir(originalDir)\n\t}()\n\n\tif err := os.Chdir(tmpDir); err != nil {\n\t\tt.Fatalf(\"Failed to change to temp directory: %v\", err)\n\t}\n\n\t// Initialize a git repository\n\tif err := os.WriteFile(\"test.txt\", []byte(\"test\"), 0644); err != nil {\n\t\tt.Fatalf(\"Failed to create test file: %v\", err)\n\t}\n\tif cmd := exec.Command(\"git\", \"init\"); cmd.Run() != nil {\n\t\tt.Skip(\"Skipping test - git not available\")\n\t}\n\n\ttests := []struct {\n\t\tname            string\n\t\texistingContent string\n\t\texpectedContent string\n\t\texpectUpdated   bool\n\t}{\n\t\t{\n\t\t\tname:            \"creates new gitattributes file\",\n\t\t\texistingContent: \"\",\n\t\t\texpectedContent: \".github/workflows/*.lock.yml linguist-generated=true\",\n\t\t\texpectUpdated:   true,\n\t\t},\n\t\t{\n\t\t\tname:            \"adds entry to existing file\",\n\t\t\texistingContent: \"*.generated linguist-generated=true\\n\",\n\t\t\texpectedContent: \"*.generated linguist-generated=true\\n\\n.github/workflows/*.lock.yml linguist-generated=true\",\n\t\t\texpectUpdated:   true,\n\t\t},\n\t\t{\n\t\t\tname:            \"does not duplicate existing entry\",\n\t\t\texistingContent: \".github/workflows/*.lock.yml linguist-generated=true\\n\",\n\t\t\texpectedContent: \".github/workflows/*.lock.yml linguist-generated=true\",\n\t\t\texpectUpdated:   false,\n\t\t},\n\t\t{\n\t\t\tname:            \"does not duplicate entry with different order\",\n\t\t\texistingContent: \"*.md linguist-documentation=true\\n.github/workflows/*.lock.yml linguist-generated=true\\n*.txt text=auto\\n\",\n\t\t\texpectedContent: \"*.md linguist-documentation=true\\n.github/workflows/*.lock.yml linguist-generated=true\\n*.txt text=auto\",\n\t\t\texpectUpdated:   false,\n\t\t},\n\t\t{\n\t\t\tname:            \"migrates legacy merge=ours entry\",\n\t\t\texistingContent: \"*.md linguist-documentation=true\\n.github/workflows/*.lock.yml linguist-generated=true merge=ours\\n*.txt text=auto\\n\",\n\t\t\texpectedContent: \"*.md linguist-documentation=true\\n.github/workflows/*.lock.yml linguist-generated=true\\n*.txt text=auto\",\n\t\t\texpectUpdated:   true,\n\t\t},\n\t\t{\n\t\t\tname:            \"does not rewrite repository-owned lock-yml policy\",\n\t\t\texistingContent: \"*.md linguist-documentation=true\\n.github/workflows/*.lock.yml linguist-generated=true merge=union\\n*.txt text=auto\\n\",\n\t\t\texpectedContent: \"*.md linguist-documentation=true\\n.github/workflows/*.lock.yml linguist-generated=true merge=union\\n*.txt text=auto\\n\\n.github/workflows/*.lock.yml linguist-generated=true\",\n\t\t\texpectUpdated:   true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgitAttributesPath := \".gitattributes\"\n\n\t\t\t// Remove any existing .gitattributes\n\t\t\tos.Remove(gitAttributesPath)\n\n\t\t\t// Create initial content if specified\n\t\t\tif tt.existingContent != \"\" {\n\t\t\t\tif err := os.WriteFile(gitAttributesPath, []byte(tt.existingContent), 0644); err != nil {\n\t\t\t\t\tt.Fatalf(\"Failed to create initial .gitattributes: %v\", err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Call the function\n\t\t\tupdated, err := ensureGitAttributes()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"ensureGitAttributes() returned error: %v\", err)\n\t\t\t}\n\n\t\t\tif updated != tt.expectUpdated {\n\t\t\t\tt.Errorf(\"ensureGitAttributes() updated=%v, want %v\", updated, tt.expectUpdated)\n\t\t\t}\n\n\t\t\t// Check that file exists\n\t\t\tif _, err := os.Stat(gitAttributesPath); os.IsNotExist(err) {\n<shellId: 13 completed with exit code 0>","detailedContent":"//go:build !integration\n\npackage cli\n\nimport (\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestEnsureGitAttributes(t *testing.T) {\n\t// Create a temporary directory for testing\n\ttmpDir, err := os.MkdirTemp(\"\", \"gh-aw-gitattributes-test\")\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create temp dir: %v\", err)\n\t}\n\tdefer os.RemoveAll(tmpDir)\n\n\t// Change to temp directory\n\toriginalDir, err := os.Getwd()\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to get current directory: %v\", err)\n\t}\n\tdefer func() {\n\t\t_ = os.Chdir(originalDir)\n\t}()\n\n\tif err := os.Chdir(tmpDir); err != nil {\n\t\tt.Fatalf(\"Failed to change to temp directory: %v\", err)\n\t}\n\n\t// Initialize a git repository\n\tif err := os.WriteFile(\"test.txt\", []byte(\"test\"), 0644); err != nil {\n\t\tt.Fatalf(\"Failed to create test file: %v\", err)\n\t}\n\tif cmd := exec.Command(\"git\", \"init\"); cmd.Run() != nil {\n\t\tt.Skip(\"Skipping test - git not available\")\n\t}\n\n\ttests := []struct {\n\t\tname            string\n\t\texistingContent string\n\t\texpectedContent string\n\t\texpectUpdated   bool\n\t}{\n\t\t{\n\t\t\tname:            \"creates new gitattributes file\",\n\t\t\texistingContent: \"\",\n\t\t\texpectedContent: \".github/workflows/*.lock.yml linguist-generated=true\",\n\t\t\texpectUpdated:   true,\n\t\t},\n\t\t{\n\t\t\tname:            \"adds entry to existing file\",\n\t\t\texistingContent: \"*.generated linguist-generated=true\\n\",\n\t\t\texpectedContent: \"*.generated linguist-generated=true\\n\\n.github/workflows/*.lock.yml linguist-generated=true\",\n\t\t\texpectUpdated:   true,\n\t\t},\n\t\t{\n\t\t\tname:            \"does not duplicate existing entry\",\n\t\t\texistingContent: \".github/workflows/*.lock.yml linguist-generated=true\\n\",\n\t\t\texpectedContent: \".github/workflows/*.lock.yml linguist-generated=true\",\n\t\t\texpectUpdated:   false,\n\t\t},\n\t\t{\n\t\t\tname:            \"does not duplicate entry with different order\",\n\t\t\texistingContent: \"*.md linguist-documentation=true\\n.github/workflows/*.lock.yml linguist-generated=true\\n*.txt text=auto\\n\",\n\t\t\texpectedContent: \"*.md linguist-documentation=true\\n.github/workflows/*.lock.yml linguist-generated=true\\n*.txt text=auto\",\n\t\t\texpectUpdated:   false,\n\t\t},\n\t\t{\n\t\t\tname:            \"migrates legacy merge=ours entry\",\n\t\t\texistingContent: \"*.md linguist-documentation=true\\n.github/workflows/*.lock.yml linguist-generated=true merge=ours\\n*.txt text=auto\\n\",\n\t\t\texpectedContent: \"*.md linguist-documentation=true\\n.github/workflows/*.lock.yml linguist-generated=true\\n*.txt text=auto\",\n\t\t\texpectUpdated:   true,\n\t\t},\n\t\t{\n\t\t\tname:            \"does not rewrite repository-owned lock-yml policy\",\n\t\t\texistingContent: \"*.md linguist-documentation=true\\n.github/workflows/*.lock.yml linguist-generated=true merge=union\\n*.txt text=auto\\n\",\n\t\t\texpectedContent: \"*.md linguist-documentation=true\\n.github/workflows/*.lock.yml linguist-generated=true merge=union\\n*.txt text=auto\\n\\n.github/workflows/*.lock.yml linguist-generated=true\",\n\t\t\texpectUpdated:   true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgitAttributesPath := \".gitattributes\"\n\n\t\t\t// Remove any existing .gitattributes\n\t\t\tos.Remove(gitAttributesPath)\n\n\t\t\t// Create initial content if specified\n\t\t\tif tt.existingContent != \"\" {\n\t\t\t\tif err := os.WriteFile(gitAttributesPath, []byte(tt.existingContent), 0644); err != nil {\n\t\t\t\t\tt.Fatalf(\"Failed to create initial .gitattributes: %v\", err)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Call the function\n\t\t\tupdated, err := ensureGitAttributes()\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"ensureGitAttributes() returned error: %v\", err)\n\t\t\t}\n\n\t\t\tif updated != tt.expectUpdated {\n\t\t\t\tt.Errorf(\"ensureGitAttributes() updated=%v, want %v\", updated, tt.expectUpdated)\n\t\t\t}\n\n\t\t\t// Check that file exists\n\t\t\tif _, err := os.Stat(gitAttributesPath); os.IsNotExist(err) {\n<shellId: 13 completed with exit code 0>"}}}
{"type":"assistant.message","timestamp":"2026-08-05T17:46:56.017Z","data":{"content":""}}
{"type":"tool.execution_start","timestamp":"2026-08-05T17:46:56.020Z","data":{"toolName":"task","mcpServerName":""}}
{"type":"subagent.started","timestamp":"2026-08-05T17:46:56.031Z","data":{"agentName":"general-purpose","agentDisplayName":"General Purpose Agent","toolCallId":"toolu_01N3saFMH74EDVcBX9hbBmBe"}}
[copilot-sdk-driver] [sdk-driver] error: Execution failed: Error: No model available. Check policy enablement under GitHub Settings > Copilot
{"type":"subagent.completed","timestamp":"2026-08-05T17:46:56.077Z","data":{"agentName":"general-purpose","toolCallId":"toolu_01N3saFMH74EDVcBX9hbBmBe"}}

Action Required

Assign this issue to an agent to debug and fix the issue.

Debug with any coding agent

Use this prompt with any coding agent (GitHub Copilot, Claude, Gemini, etc.):

Debug the agentic workflow failure using https://raw.githubusercontent.com/github/gh-aw/main/debug.md

The failed workflow run is at https://github.com/github/gh-aw/actions/runs/31030978505
Manually invoke the agent

Debug this workflow failure using your favorite Agent CLI and the agentic-workflows prompt.

Tip

Stop reporting this workflow as a failure

To stop a workflow from creating failure issues, set report-failure-as-issue: false in its frontmatter:

safe-outputs:
  report-failure-as-issue: false

Generated from PR Code Quality Reviewer · 60.5 AIC · ◷

  • expires on Aug 6, 2026, 5:50 AM UTC

Activity

  1. github-actions commented on Aug 5, 2026

    @github-actions
    ContributorAuthor

    Agent job 31032399483 failed.

    Warning

    Engine Failure: The copilot engine terminated unexpectedly.

    Last agent output:

    {"type":"tool.execution_complete","timestamp":"2026-08-05T18:10:45.977Z","data":{"toolName":"bash","mcpServerName":"","success":true,"result":{"content":"if (\"draft\" in pullRequest) {\n    nextState.draft = pullRequest.draft === true;\n  }\n  if (pullRequest.head && typeof pullRequest.head.sha === \"string\") {\n    nextState.head_sha = pullRequest.head.sha;\n  }\n  return nextState;\n}\n\nasync function fetchIssueState(github, repoParts, issueNumber) {\n  const { data: issue } = await github.rest.issues.get({\n    owner: repoParts.owner,\n    repo: repoParts.repo,\n    issue_number: issueNumber,\n  });\n  return extractIssueStateFromData(issue);\n}\n\n/**\n * `@typedef` {{ requested_reviewers: string[], requested_team_reviewers: string[], reviews: Array<{id?: number, user?: string, state?: string, submitted_at?: string}> }} ReviewState\n */\n\nfunction extractReviewStateFromData(pullRequest, reviews) {\n  return {\n    requested_reviewers: normalizeRequestedReviewers(pullRequest?.requested_reviewers),\n    requested_team_reviewers: normalizeRequestedTeams(pullRequest?.requested_teams ?? pullRequest?.requested_team_reviewers),\n    reviews: normalizeReviews(reviews),\n  };\n}\n\nasync function fetchPullRequestReviewState(github, repoParts, pullRequestNumber) {\n  // Fetch sequentially so pulls.get failures (including rate limits) bail early and\n  // avoid spending a second API call for listReviews in degraded mode.\n  const { data: pullRequest } = await github.rest.pulls.get({\n    owner: repoParts.owner,\n    repo: repoParts.repo,\n    pull_number: pullRequestNumber,\n  });\n  const { data: reviews } = await github.rest.pulls.listReviews({\n    owner: repoParts.owner,\n    repo: repoParts.repo,\n<shellId: 37 completed with exit code 0>","detailedContent":"if (\"draft\" in pullRequest) {\n    nextState.draft = pullRequest.draft === true;\n  }\n  if (pullRequest.head && typeof pullRequest.head.sha === \"string\") {\n    nextState.head_sha = pullRequest.head.sha;\n  }\n  return nextState;\n}\n\nasync function fetchIssueState(github, repoParts, issueNumber) {\n  const { data: issue } = await github.rest.issues.get({\n    owner: repoParts.owner,\n    repo: repoParts.repo,\n    issue_number: issueNumber,\n  });\n  return extractIssueStateFromData(issue);\n}\n\n/**\n * `@typedef` {{ requested_reviewers: string[], requested_team_reviewers: string[], reviews: Array<{id?: number, user?: string, state?: string, submitted_at?: string}> }} ReviewState\n */\n\nfunction extractReviewStateFromData(pullRequest, reviews) {\n  return {\n    requested_reviewers: normalizeRequestedReviewers(pullRequest?.requested_reviewers),\n    requested_team_reviewers: normalizeRequestedTeams(pullRequest?.requested_teams ?? pullRequest?.requested_team_reviewers),\n    reviews: normalizeReviews(reviews),\n  };\n}\n\nasync function fetchPullRequestReviewState(github, repoParts, pullRequestNumber) {\n  // Fetch sequentially so pulls.get failures (including rate limits) bail early and\n  // avoid spending a second API call for listReviews in degraded mode.\n  const { data: pullRequest } = await github.rest.pulls.get({\n    owner: repoParts.owner,\n    repo: repoParts.repo,\n    pull_number: pullRequestNumber,\n  });\n  const { data: reviews } = await github.rest.pulls.listReviews({\n    owner: repoParts.owner,\n    repo: repoParts.repo,\n<shellId: 37 completed with exit code 0>"}}}
    {"type":"assistant.message","timestamp":"2026-08-05T18:10:51.858Z","data":{"content":""}}
    {"type":"tool.execution_start","timestamp":"2026-08-05T18:10:51.860Z","data":{"toolName":"bash","mcpServerName":"","command":"cd /home/runner/work/gh-aw/gh-aw && grep -n \"function extractIssueStateFromData\" -A 20 actions/setup/js/safe_output_execution_metadata.cjs"}}
    {"type":"tool.execution_complete","timestamp":"2026-08-05T18:10:51.920Z","data":{"toolName":"bash","mcpServerName":"","success":true,"result":{"content":"104:function extractIssueStateFromData(issue) {\n105-  return {\n106-    title: typeof issue?.title === \"string\" ? issue.title : \"\",\n107-    body_hash: hashNormalizedBody(issue?.body),\n108-    state: typeof issue?.state === \"string\" ? issue.state : \"\",\n109-    labels: normalizeLabelNames(issue?.labels),\n110-    assignees: normalizeAssigneeLogins(issue?.assignees),\n111-  };\n112-}\n113-\n114-function mergeIssueState(baseState, issue) {\n115-  const nextState = {\n116-    title: \"\",\n117-    body_hash: \"\",\n118-    state: \"\",\n119-    labels: [],\n120-    assignees: [],\n121-    ...(baseState || {}),\n122-  };\n123-  if (!issue || typeof issue !== \"object\") {\n124-    return nextState;\n<shellId: 38 completed with exit code 0>","detailedContent":"104:function extractIssueStateFromData(issue) {\n105-  return {\n106-    title: typeof issue?.title === \"string\" ? issue.title : \"\",\n107-    body_hash: hashNormalizedBody(issue?.body),\n108-    state: typeof issue?.state === \"string\" ? issue.state : \"\",\n109-    labels: normalizeLabelNames(issue?.labels),\n110-    assignees: normalizeAssigneeLogins(issue?.assignees),\n111-  };\n112-}\n113-\n114-function mergeIssueState(baseState, issue) {\n115-  const nextState = {\n116-    title: \"\",\n117-    body_hash: \"\",\n118-    state: \"\",\n119-    labels: [],\n120-    assignees: [],\n121-    ...(baseState || {}),\n122-  };\n123-  if (!issue || typeof issue !== \"object\") {\n124-    return nextState;\n<shellId: 38 completed with exit code 0>"}}}
    {"type":"assistant.message","timestamp":"2026-08-05T18:11:21.179Z","data":{"content":""}}
    {"type":"tool.execution_start","timestamp":"2026-08-05T18:11:21.182Z","data":{"toolName":"task","mcpServerName":""}}
    {"type":"subagent.started","timestamp":"2026-08-05T18:11:21.190Z","data":{"agentName":"general-purpose","agentDisplayName":"General Purpose Agent","toolCallId":"toolu_01VKJnQqfJiLZgMYqqhTttHq"}}
    [copilot-sdk-driver] [sdk-driver] error: Execution failed: Error: No model available. Check policy enablement under GitHub Settings > Copilot
    {"type":"subagent.completed","timestamp":"2026-08-05T18:11:21.228Z","data":{"agentName":"general-purpose","toolCallId":"toolu_01VKJnQqfJiLZgMYqqhTttHq"}}
    {"type":"tool.execution_complete","timestamp":"2026-08-05T18:11:21.249Z","data":{"toolName":"task","mcpServerName":"","success":false}}
    

    Generated from PR Code Quality Reviewer · 120.3 AIC · ◷

  2. github-actions commented on Aug 5, 2026

    @github-actions
    ContributorAuthor

    Agent job 31054008861 failed.

    Warning

    Engine Failure: The copilot engine terminated unexpectedly.

    Last agent output:

    {"type":"tool.execution_complete","timestamp":"2026-08-05T23:00:39.633Z","data":{"toolName":"bash","mcpServerName":"","success":true,"result":{"content":"{\"additions\":67,\"body\":\"The `errormessage` analyzer only inspects files listed in `-changed-files` and silently no-ops otherwise, so the ~1,129 pre-existing error-message violations across `pkg/` are invisible to tooling. This adds an opt-in full-repository mode so that debt can be measured and tracked, while diff-gating behavior stays unchanged.\\n\\n## Changes\\n\\n- **`pkg/linters/errormessage/errormessage.go`**\\n  - New `-full-repo` bool flag, plus an `-changed-files=all` sentinel for callers that only plumb the CSV flag.\\n  - `run` splits into a scope decision and a new `runOnFiles(pass, changed)`; a `nil` changed-set means \\\"every file in scope\\\", handled in `shouldCheckFile`.\\n  - Empty `-changed-files` still no-ops, so existing CI gating is untouched.\\n\\n- **`Makefile`** — non-blocking `lint-error-messages-report` target that builds `cmd/linters` and audits `./cmd/... ./pkg/...`, always exiting 0 so it can run as a metric rather than a gate.\\n\\n- **Tests** — cover both entry points (`-full-repo` and `-changed-files=all`) against the existing `analysistest` fixtures.\\n\\n- **Docs** — `pkg/linters/README.md` and the analyzer `Doc` string note the new mode.\\n\\n## Usage\\n\\n```bash\\n# non-blocking repo-wide report\\nmake lint-error-messages-report\\n\\n# equivalent direct invocations\\ngh-aw-linters -errormessage -errormessage.full-repo ./pkg/...\\ngh-aw-linters -errormessage -errormessage.changed-files=all ./pkg/...\\n```\\n\\nFor reference, `./pkg/parser/...` alone surfaces 255 findings in this mode versus none before.\\n\\n<!-- START COPILOT CODING AGENT SUFFIX -->\\n\\n- Fixes #50591\",\"changedFiles\":4,\"deletions\":4,\"files\":[{\"path\":\"Makefile\",\"additions\":11,\"deletions\":0,\"changeType\":\"MODIFIED\"},{\"path\":\"pkg/linters/README.md\",\"additions\":2,\"deletions\":2,\"changeType\":\"MODIFIED\"},{\"path\":\"pkg/linters/errormessage/errormessage.go\",\"additions\":32,\"deletions\":2,\"changeType\":\"MODIFIED\"},{\"path\":\"pkg/linters/errormessage/errormessage_test.go\",\"additions\":22,\"deletions\":0,\"changeType\":\"MODIFIED\"}],\"headRefName\":\"copilot/deep-report-add-full-repo-audit-mode\",\"headRefOid\":\"60c7749c36d89c3da1149cdd86beea00f8d3928e\",\"number\":50695,\"title\":\"Add full-repo audit mode to pkg/linters/errormessage\"}\n---\n153 /tmp/gh-aw/agent/pr-diff.patch\n---\n[]\n<shellId: 11 completed with exit code 0>","detailedContent":"{\"additions\":67,\"body\":\"The `errormessage` analyzer only inspects files listed in `-changed-files` and silently no-ops otherwise, so the ~1,129 pre-existing error-message violations across `pkg/` are invisible to tooling. This adds an opt-in full-repository mode so that debt can be measured and tracked, while diff-gating behavior stays unchanged.\\n\\n## Changes\\n\\n- **`pkg/linters/errormessage/errormessage.go`**\\n  - New `-full-repo` bool flag, plus an `-changed-files=all` sentinel for callers that only plumb the CSV flag.\\n  - `run` splits into a scope decision and a new `runOnFiles(pass, changed)`; a `nil` changed-set means \\\"every file in scope\\\", handled in `shouldCheckFile`.\\n  - Empty `-changed-files` still no-ops, so existing CI gating is untouched.\\n\\n- **`Makefile`** — non-blocking `lint-error-messages-report` target that builds `cmd/linters` and audits `./cmd/... ./pkg/...`, always exiting 0 so it can run as a metric rather than a gate.\\n\\n- **Tests** — cover both entry points (`-full-repo` and `-changed-files=all`) against the existing `analysistest` fixtures.\\n\\n- **Docs** — `pkg/linters/README.md` and the analyzer `Doc` string note the new mode.\\n\\n## Usage\\n\\n```bash\\n# non-blocking repo-wide report\\nmake lint-error-messages-report\\n\\n# equivalent direct invocations\\ngh-aw-linters -errormessage -errormessage.full-repo ./pkg/...\\ngh-aw-linters -errormessage -errormessage.changed-files=all ./pkg/...\\n```\\n\\nFor reference, `./pkg/parser/...` alone surfaces 255 findings in this mode versus none before.\\n\\n<!-- START COPILOT CODING AGENT SUFFIX -->\\n\\n- Fixes #50591\",\"changedFiles\":4,\"deletions\":4,\"files\":[{\"path\":\"Makefile\",\"additions\":11,\"deletions\":0,\"changeType\":\"MODIFIED\"},{\"path\":\"pkg/linters/README.md\",\"additions\":2,\"deletions\":2,\"changeType\":\"MODIFIED\"},{\"path\":\"pkg/linters/errormessage/errormessage.go\",\"additions\":32,\"deletions\":2,\"changeType\":\"MODIFIED\"},{\"path\":\"pkg/linters/errormessage/errormessage_test.go\",\"additions\":22,\"deletions\":0,\"changeType\":\"MODIFIED\"}],\"headRefName\":\"copilot/deep-report-add-full-repo-audit-mode\",\"headRefOid\":\"60c7749c36d89c3da1149cdd86beea00f8d3928e\",\"number\":50695,\"title\":\"Add full-repo audit mode to pkg/linters/errormessage\"}\n---\n153 /tmp/gh-aw/agent/pr-diff.patch\n---\n[]\n<shellId: 11 completed with exit code 0>"}}}
    {"type":"assistant.message","timestamp":"2026-08-05T23:00:41.134Z","data":{"content":""}}
    {"type":"tool.execution_start","timestamp":"2026-08-05T23:00:41.135Z","data":{"toolName":"view","mcpServerName":""}}
    {"type":"tool.execution_complete","timestamp":"2026-08-05T23:00:41.188Z","data":{"toolName":"view","mcpServerName":"","success":true,"result":{"content":"1. diff --git a/Makefile b/Makefile\n2. index 04df77d164d..b3e6675b343 100644\n3. --- a/Makefile\n4. +++ b/Makefile\n5. @@ -1023,6 +1023,16 @@ lint-cjs: fmt-check-cjs validate-cjs-syntax check-node-version\n6.  lint-json: fmt-check-json\n7.  \t@echo \"✓ JSON formatting validated\"\n8.  \n9. +# Full-repository error-message audit (non-blocking report).\n10. +# Reports pre-existing error-message violations across the repo so the debt can\n11. +# be tracked as a metric over time. Always exits 0.\n12. +.PHONY: lint-error-messages-report\n13. +lint-error-messages-report:\n14. +\t@echo \"Building custom linters...\"\n15. +\t@env -u GOOS -u GOARCH go build -o /tmp/gh-aw-linters ./cmd/linters\n16. +\t@echo \"Auditing error messages across $(LINTER_PACKAGES) (non-blocking)...\"\n17. +\t@/tmp/gh-aw-linters -errormessage -errormessage.full-repo $(LINTER_PACKAGES) || true\n18. +\n19.  # Lint error messages for quality compliance\n20.  .PHONY: lint-errors\n21.  lint-errors:\n22. @@ -1399,6 +1409,7 @@ help:\n23.  \t@echo \"  validate-cjs-syntax - Syntax-check all non-test .cjs files (catches module-load SyntaxErrors)\"\n24.  \t@echo \"  lint-json        - Lint JSON files in pkg directory (excluding actions/setup/js)\"\n25.  \t@echo \"  lint-errors      - Lint error messages for quality compliance\"\n26. +\t@echo \"  lint-error-messages-report - Non-blocking full-repo error message audit\"\n27.  \t@echo \"  validate-otel-contract - Validate the gh-aw OpenTelemetry compatibility contract\"\n28.  \t@echo \"  lint-action-sh   - Lint action shell scripts for python/python3 invocations\"\n29.  \t@echo \"  shellcheck-setup-sh - Run shellcheck on actions/setup/sh scripts\"\n30. diff --git a/pkg/linters/README.md b/pkg/linters/README.md\n31. index 60fe1ff1a20..30f7ea61b4d 100644\n32. --- a/pkg/linters/README.md\n33. +++ b/pkg/linters/README.md\n34. @@ -15,7 +15,7 @@ This package currently provides custom Go analyzers in the following subpackages\n35.  - `deferinloop` — reports `defer` statements placed directly inside `for`/`range` loop bodies, which execute when the enclosing function returns rather than each iteration and can cause resource leaks.\n36.  - `errorfwrapv` — reports `fmt.Errorf` calls that pass error arguments without `%w` wrapping.\n37.  - `excessivefuncparams` — reports function declarations that exceed a configurable parameter-count threshold.\n38. -- `errormessage` — reports non-actionable error-message patterns in changed files.\n39. +- `errormessage` — reports non-actionable error-message patterns in changed files; pass `-errormessage.full-repo` (or `-errormessage.changed-files=all`) to audit the whole repository.\n40.  - `errortypeassertion` — reports type assertions from `error` to concrete types and recommends `errors.As`.\n41.  - `errstringmatch` — reports `strings.Contains(err.Error(), \"...\")` patterns and recommends `errors.Is` / `errors.As`.\n42.  - `fileclosenotdeferred` — reports non-deferred file `Close()` calls that can leak resources.\n43. @@ -85,7 +85,7 @@ This package currently provides custom Go analyzers in the following subpackages\n44.  | `deferinloop` | Custom `go/analysis` analyzer that flags `defer` statements inside `for`/`range` loop bodies that execute when the enclosing function returns rather than each iteration |\n45.  | `errorfwrapv` | Custom `go/analysis` analyzer that flags `fmt.Errorf` calls that pass error arguments without `%w` wrapping |\n46.  | `excessivefuncparams` | Custom `go/analysis` analyzer that flags function declarations with too many positional parameters |\n47. -| `errormessage` | Custom `go/analysis` analyzer that flags non-actionable error message patterns in changed files |\n48. +| `errormessage` | Custom `go/analysis` analyzer that flags non-actionable error message patterns in changed files (or all files with `-errormessage.full-repo`) |\n49.  | `errortypeassertion` | Custom `go/analysis` analyzer that flags type assertions from `error` to concrete types and recommends `errors.As` |\n50.  | `errstringmatch` | Custom `go/analysis` analyzer that flags brittle `strings.Contains(err.Error(), \"...\")` checks |\n51.  | `execcommandwithoutcontext` | Custom `go/analysis` analyzer that flags `exec.Command(...)` calls that should use `exec.CommandContext(...)` in context-receiving functions |diff --git a/pkg/linters/errormessage/errormessage.go b/pkg/linters/errormessage/errormessage.go\n52. index 2557a55979f..f664fb4c805 100644\n53. --- a/pkg/linters/errormessage/errormessage.go\n54. +++ b/pkg/linters/errormessage/errormessage.go\n55. @@ -24,22 +24,35 @@ var (\n56.  \t// changedFilesCSV allows CI to scope linting to changed files only,\n57.  \t// preventing legacy violations from blocking incremental adoption.\n58.  \tchangedFilesCSV string\n59. +\t// fullRepo enables auditing every analyzed file instead of only the\n60. +\t// changed ones, so pre-existing violations can be tracked as a metric.\n61. +\tfullRepo bool\n62.  )\n63.  \n64. +// fullRepoSentinel is the -changed-files value that enables full-repository\n65. +// auditing, equivalent to passing -full-repo.\n66. +const fullRepoSentinel = \"all\"\n67. +\n68.  // Analyzer is the errormessage analysis pass.\n69.  var Analyzer = &analysis.Analyzer{\n70.  \tName:     \"errormessage\",\n71. -\tDoc:      \"reports non-actionable error message patterns in changed files\",\n72. +\tDoc:      \"reports non-actionable error message patterns in changed files (or all files with -full-repo)\",\n73.  \tURL:      \"https://github.com/github/gh-aw/tree/main/pkg/linters/errormessage\",\n74.  \tRequires: []*analysis.Analyzer{inspect.Analyzer, nolint.Analyzer, filecheck.Analyzer},\n75.  \tRun:      run,\n76.  }\n77.  \n78.  func init() {\n79. -\tAnalyzer.Flags.StringVar(&changedFilesCSV, \"changed-files\", \"\", \"comma-separated list of changed file paths to lint (when empty, analyzer is a no-op)\")\n80. +\tAnalyzer.Flags.StringVar(&changedFilesCSV, \"changed-files\", \"\", \"comma-separated list of changed file paths to lint (when empty, analyzer is a no-op; use \\\"all\\\" to audit every file)\")\n81. +\tAnalyzer.Flags.BoolVar(&fullRepo, \"full-repo\", false, \"audit every analyzed file instead of only the changed ones\")\n82.  }\n83.  \n84.  func run(pass *analysis.Pass) (any, error) {\n85. +\tif fullRepo || isFullRepoSentinel(changedFilesCSV) {\n86. +\t\tpkgLog.Printf(\"analyzing package %s in full-repo mode\", pass.Pkg.Path())\n87. +\t\treturn runOnFiles(pass, nil)\n88. +\t}\n89. +\n90.  \tchanged := parseChangedFiles(changedFilesCSV)\n91.  \tif len(changed) == 0 {\n92.  \t\tpkgLog.Printf(\"no changed files provided for %s, skipping\", pass.Pkg.Path())\n93. @@ -47,6 +60,12 @@ func run(pass *analysis.Pass) (any, error) {\n94.  \t}\n95.  \tpkgLog.Printf(\"analyzing package %s (%d changed files)\", pass.Pkg.Path(), len(changed))\n96.  \n97. +\treturn runOnFiles(pass, changed)\n98. +}\n99. +\n100. +// runOnFiles analyzes the package. When changed is nil every file is checked\n101. +// (full-repo audit mode); otherwise only files present in changed are checked.\n102. +func runOnFiles(pass *analysis.Pass, changed map[string]struct{}) (any, error) {\n103.  \tinsp, err := astutil.Inspector(pass)\n104.  \tif err != nil {\n105.  \t\treturn nil, err\n106. @@ -104,7 +123,18 @@ func parseChangedFiles(csv string) map[string]struct{} {\n107.  \treturn changed\n108.  }\n109.  \n110. +// isFullRepoSentinel reports whether the -changed-files value requests a\n111. +// full-repository audit.\n112. +func isFullRepoSentinel(csv string) bool {\n113. +\treturn strings.EqualFold(strings.TrimSpace(csv), fullRepoSentinel)\n114. +}\n115. +\n116. +// shouldCheckFile reports whether filename is in scope. A nil changed set means\n117. +// full-repo audit mode, where every file is in scope.\n118.  func shouldCheckFile(filename string, changed map[string]struct{}) bool {\n119. +\tif changed == nil {\n120. +\t\treturn true\n121. +\t}\n122.  \tpath := filepath.ToSlash(filename)\n123.  \tfor changedPath := range changed {\n124.  \t\tif path == changedPath || strings.HasSuffix(path, \"/\"+changedPath) {diff --git a/pkg/linters/errormessage/errormessage_test.go b/pkg/linters/errormessage/errormessage_test.go\n125. index 7d928b43b0c..7bde75c9bee 100644\n126. --- a/pkg/linters/errormessage/errormessage_test.go\n127. +++ b/pkg/linters/errormessage/errormessage_test.go\n128. @@ -22,3 +22,25 @@ func TestErrorMessage(t *testing.T) {\n129.  \n130.  \tanalysistest.Run(t, analysistest.TestData(), errormessage.Analyzer, \"errormessage\")\n131.  }\n132. +\n133. +func TestErrorMessageFullRepoFlag(t *testing.T) {\n134. +\tif err := errormessage.Analyzer.Flags.Set(\"full-repo\", \"true\"); err != nil {\n135. +\t\tt.Fatalf(\"failed to set full-repo flag: %v\", err)\n136. +\t}\n137. +\tt.Cleanup(func() {\n138. +\t\t_ = errormessage.Analyzer.Flags.Set(\"full-repo\", \"false\")\n139. +\t})\n140. +\n141. +\tanalysistest.Run(t, analysistest.TestData(), errormessage.Analyzer, \"errormessage\")\n142. +}\n143. +\n144. +func TestErrorMessageFullRepoSentinel(t *testing.T) {\n145. +\tif err := errormessage.Analyzer.Flags.Set(\"changed-files\", \"all\"); err != nil {\n146. +\t\tt.Fatalf(\"failed to set changed-files flag: %v\", err)\n147. +\t}\n148. +\tt.Cleanup(func() {\n149. +\t\t_ = errormessage.Analyzer.Flags.Set(\"changed-files\", \"\")\n150. +\t})\n151. +\n152. +\tanalysistest.Run(t, analysistest.TestData(), errormessage.Analyzer, \"errormessage\")\n153. +}\n154. ","detailedContent":"\ndiff --git a/tmp/gh-aw/agent/pr-diff.patch b/tmp/gh-aw/agent/pr-diff.patch\nindex 0000000..0000000 100644\n--- a/tmp/gh-aw/agent/pr-diff.patch\n+++ b/tmp/gh-aw/agent/pr-diff.patch\n@@ -1,154 +1,154 @@\n diff --git a/Makefile b/Makefile\n index 04df77d164d..b3e6675b343 100644\n --- a/Makefile\n +++ b/Makefile\n @@ -1023,6 +1023,16 @@ lint-cjs: fmt-check-cjs validate-cjs-syntax check-node-version\n  lint-json: fmt-check-json\n  \t@echo \"✓ JSON formatting validated\"\n  \n +# Full-repository error-message audit (non-blocking report).\n +# Reports pre-existing error-message violations across the repo so the debt can\n +# be tracked as a metric over time. Always exits 0.\n +.PHONY: lint-error-messages-report\n +lint-error-messages-report:\n +\t@echo \"Building custom linters...\"\n +\t@env -u GOOS -u GOARCH go build -o /tmp/gh-aw-linters ./cmd/linters\n +\t@echo \"Auditing error messages across $(LINTER_PACKAGES) (non-blocking)...\"\n +\t@/tmp/gh-aw-linters -errormessage -errormessage.full-repo $(LINTER_PACKAGES) || true\n +\n  # Lint error messages for quality compliance\n  .PHONY: lint-errors\n  lint-errors:\n @@ -1399,6 +1409,7 @@ help:\n  \t@echo \"  validate-cjs-syntax - Syntax-check all non-test .cjs files (catches module-load SyntaxErrors)\"\n  \t@echo \"  lint-json        - Lint JSON files in pkg directory (excluding actions/setup/js)\"\n  \t@echo \"  lint-errors      - Lint error messages for quality compliance\"\n +\t@echo \"  lint-error-messages-report - Non-blocking full-repo error message audit\"\n  \t@echo \"  validate-otel-contract - Validate the gh-aw OpenTelemetry compatibility contract\"\n  \t@echo \"  lint-action-sh   - Lint action shell scripts for python/python3 invocations\"\n  \t@echo \"  shellcheck-setup-sh - Run shellcheck on actions/setup/sh scripts\"\n diff --git a/pkg/linters/README.md b/pkg/linters/README.md\n index 60fe1ff1a20..30f7ea61b4d 100644\n --- a/pkg/linters/README.md\n +++ b/pkg/linters/README.md\n @@ -15,7 +15,7 @@ This package currently provides custom Go analyzers in the following subpackages\n  - `deferinloop` — reports `defer` statements placed directly inside `for`/`range` loop bodies, which execute when the enclosing function returns rather than each iteration and can cause resource leaks.\n  - `errorfwrapv` — reports `fmt.Errorf` calls that pass error arguments without `%w` wrapping.\n  - `excessivefuncparams` — reports function declarations that exceed a configurable parameter-count threshold.\n -- `errormessage` — reports non-actionable error-message patterns in changed files.\n +- `errormessage` — reports non-actionable error-message patterns in changed files; pass `-errormessage.full-repo` (or `-errormessage.changed-files=all`) to audit the whole repository.\n  - `errortypeassertion` — reports type assertions from `error` to concrete types and recommends `errors.As`.\n  - `errstringmatch` — reports `strings.Contains(err.Error(), \"...\")` patterns and recommends `errors.Is` / `errors.As`.\n  - `fileclosenotdeferred` — reports non-deferred file `Close()` calls that can leak resources.\n @@ -85,7 +85,7 @@ This package currently provides custom Go analyzers in the following subpackages\n  | `deferinloop` | Custom `go/analysis` analyzer that flags `defer` statements inside `for`/`range` loop bodies that execute when the enclosing function returns rather than each iteration |\n  | `errorfwrapv` | Custom `go/analysis` analyzer that flags `fmt.Errorf` calls that pass error arguments without `%w` wrapping |\n  | `excessivefuncparams` | Custom `go/analysis` analyzer that flags function declarations with too many positional parameters |\n -| `errormessage` | Custom `go/analysis` analyzer that flags non-actionable error message patterns in changed files |\n +| `errormessage` | Custom `go/analysis` analyzer that flags non-actionable error message patterns in changed files (or all files with `-errormessage.full-repo`) |\n  | `errortypeassertion` | Custom `go/analysis` analyzer that flags type assertions from `error` to concrete types and recommends `errors.As` |\n  | `errstringmatch` | Custom `go/analysis` analyzer that flags brittle `strings.Contains(err.Error(), \"...\")` checks |\n  | `execcommandwithoutcontext` | Custom `go/analysis` analyzer that flags `exec.Command(...)` calls that should use `exec.CommandContext(...)` in context-receiving functions |diff --git a/pkg/linters/errormessage/errormessage.go b/pkg/linters/errormessage/errormessage.go\n index 2557a55979f..f664fb4c805 100644\n --- a/pkg/linters/errormessage/errormessage.go\n +++ b/pkg/linters/errormessage/errormessage.go\n @@ -24,22 +24,35 @@ var (\n  \t// changedFilesCSV allows CI to scope linting to changed files only,\n  \t// preventing legacy violations from blocking incremental adoption.\n  \tchangedFilesCSV string\n +\t// fullRepo enables auditing every analyzed file instead of only the\n +\t// changed ones, so pre-existing violations can be tracked as a metric.\n +\tfullRepo bool\n  )\n  \n +// fullRepoSentinel is the -changed-files value that enables full-repository\n +// auditing, equivalent to passing -full-repo.\n +const fullRepoSentinel = \"all\"\n +\n  // Analyzer is the errormessage analysis pass.\n  var Analyzer = &analysis.Analyzer{\n  \tName:     \"errormessage\",\n -\tDoc:      \"reports non-actionable error message patterns in changed files\",\n +\tDoc:      \"reports non-actionable error message patterns in changed files (or all files with -full-repo)\",\n  \tURL:      \"https://github.com/github/gh-aw/tree/main/pkg/linters/errormessage\",\n  \tRequires: []*analysis.Analyzer{inspect.Analyzer, nolint.Analyzer, filecheck.Analyzer},\n  \tRun:      run,\n  }\n  \n  func init() {\n -\tAnalyzer.Flags.StringVar(&changedFilesCSV, \"changed-files\", \"\", \"comma-separated list of changed file paths to lint (when empty, analyzer is a no-op)\")\n +\tAnalyzer.Flags.StringVar(&changedFilesCSV, \"changed-files\", \"\", \"comma-separated list of changed file paths to lint (when empty, analyzer is a no-op; use \\\"all\\\" to audit every file)\")\n +\tAnalyzer.Flags.BoolVar(&fullRepo, \"full-repo\", false, \"audit every analyzed file instead of only the changed ones\")\n  }\n  \n  func run(pass *analysis.Pass) (any, error) {\n +\tif fullRepo || isFullRepoSentinel(changedFilesCSV) {\n +\t\tpkgLog.Printf(\"analyzing package %s in full-repo mode\", pass.Pkg.Path())\n +\t\treturn runOnFiles(pass, nil)\n +\t}\n +\n  \tchanged := parseChangedFiles(changedFilesCSV)\n  \tif len(changed) == 0 {\n  \t\tpkgLog.Printf(\"no changed files provided for %s, skipping\", pass.Pkg.Path())\n @@ -47,6 +60,12 @@ func run(pass *analysis.Pass) (any, error) {\n  \t}\n  \tpkgLog.Printf(\"analyzing package %s (%d changed files)\", pass.Pkg.Path(), len(changed))\n  \n +\treturn runOnFiles(pass, changed)\n +}\n +\n +// runOnFiles analyzes the package. When changed is nil every file is checked\n +// (full-repo audit mode); otherwise only files present in changed are checked.\n +func runOnFiles(pass *analysis.Pass, changed map[string]struct{}) (any, error) {\n  \tinsp, err := astutil.Inspector(pass)\n  \tif err != nil {\n  \t\treturn nil, err\n @@ -104,7 +123,18 @@ func parseChangedFiles(csv string) map[string]struct{} {\n  \treturn changed\n  }\n  \n +// isFullRepoSentinel reports whether the -changed-files value requests a\n +// full-repository audit.\n +func isFullRepoSentinel(csv string) bool {\n +\treturn strings.EqualFold(strings.TrimSpace(csv), fullRepoSentinel)\n +}\n +\n +// shouldCheckFile reports whether filename is in scope. A nil changed set means\n +// full-repo audit mode, where every file is in scope.\n  func shouldCheckFile(filename string, changed map[string]struct{}) bool {\n +\tif changed == nil {\n +\t\treturn true\n +\t}\n  \tpath := filepath.ToSlash(filename)\n  \tfor changedPath := range changed {\n  \t\tif path == changedPath || strings.HasSuffix(path, \"/\"+changedPath) {diff --git a/pkg/linters/errormessage/errormessage_test.go b/pkg/linters/errormessage/errormessage_test.go\n index 7d928b43b0c..7bde75c9bee 100644\n --- a/pkg/linters/errormessage/errormessage_test.go\n +++ b/pkg/linters/errormessage/errormessage_test.go\n @@ -22,3 +22,25 @@ func TestErrorMessage(t *testing.T) {\n  \n  \tanalysistest.Run(t, analysistest.TestData(), errormessage.Analyzer, \"errormessage\")\n  }\n +\n +func TestErrorMessageFullRepoFlag(t *testing.T) {\n +\tif err := errormessage.Analyzer.Flags.Set(\"full-repo\", \"true\"); err != nil {\n +\t\tt.Fatalf(\"failed to set full-repo flag: %v\", err)\n +\t}\n +\tt.Cleanup(func() {\n +\t\t_ = errormessage.Analyzer.Flags.Set(\"full-repo\", \"false\")\n +\t})\n +\n +\tanalysistest.Run(t, analysistest.TestData(), errormessage.Analyzer, \"errormessage\")\n +}\n +\n +func TestErrorMessageFullRepoSentinel(t *testing.T) {\n +\tif err := errormessage.Analyzer.Flags.Set(\"changed-files\", \"all\"); err != nil {\n +\t\tt.Fatalf(\"failed to set changed-files flag: %v\", err)\n +\t}\n +\tt.Cleanup(func() {\n +\t\t_ = errormessage.Analyzer.Flags.Set(\"changed-files\", \"\")\n +\t})\n +\n +\tanalysistest.Run(t, analysistest.TestData(), errormessage.Analyzer, \"errormessage\")\n +}\n \n"}}}
    {"type":"assistant.message","timestamp":"2026-08-05T23:01:09.404Z","data":{"content":""}}
    {"type":"tool.execution_start","timestamp":"2026-08-05T23:01:09.406Z","data":{"toolName":"task","mcpServerName":""}}
    {"type":"subagent.started","timestamp":"2026-08-05T23:01:09.421Z","data":{"agentName":"general-purpose","agentDisplayName":"General Purpose Agent","toolCallId":"toolu_01Mszzsx3taf8KzDK1VjvpBV"}}
    [copilot-sdk-driver] [sdk-driver] error: Execution failed: Error: No model available. Check policy enablement under GitHub Settings > Copilot
    {"type":"subagent.completed","timestamp":"2026-08-05T23:01:09.475Z","data":{"agentName":"general-purpose","toolCallId":"toolu_01Mszzsx3taf8KzDK1VjvpBV"}}
    {"type":"tool.execution_complete","timestamp":"2026-08-05T23:01:09.499Z","data":{"toolName":"task","mcpServerName":"","success":false}}
    

    Generated from PR Code Quality Reviewer · 60.6 AIC · ◷

  3. github-actions commented on Aug 5, 2026

    @github-actions
    ContributorAuthor

    Agent job 31054795358 failed.

    Warning

    Engine Failure: The copilot engine terminated unexpectedly.

    Last agent output:

    {"type":"tool.execution_complete","timestamp":"2026-08-05T23:07:55.927Z","data":{"toolName":"bash","mcpServerName":"","success":true,"result":{"content":"convert_gateway_config_shared.cjs:86:  } catch (err) {\nconvert_gateway_config_shared.cjs:94:  } catch (err) {\nconvert_gateway_config_shared.cjs:160:  } catch (err) {\n<shellId: 30 completed with exit code 0>","detailedContent":"convert_gateway_config_shared.cjs:86:  } catch (err) {\nconvert_gateway_config_shared.cjs:94:  } catch (err) {\nconvert_gateway_config_shared.cjs:160:  } catch (err) {\n<shellId: 30 completed with exit code 0>"}}}
    {"type":"assistant.message","timestamp":"2026-08-05T23:08:26.349Z","data":{"content":""}}
    {"type":"tool.execution_start","timestamp":"2026-08-05T23:08:26.354Z","data":{"toolName":"bash","mcpServerName":"","command":"cd /home/runner/work/gh-aw/gh-aw/actions/setup/js && grep -n \"= main()\\|main()\" convert_gateway_config_claude.test.cjs convert_gateway_config_codex.test.cjs convert_gateway_config_gemini.test.cjs convert_gateway_config_copilot.test.cjs | head -30"}}
    {"type":"tool.execution_complete","timestamp":"2026-08-05T23:08:26.394Z","data":{"toolName":"bash","mcpServerName":"","success":true,"result":{"content":"grep: convert_gateway_config_claude.test.cjs: No such file or directory\ngrep: convert_gateway_config_codex.test.cjs: No such file or directory\nconvert_gateway_config_gemini.test.cjs:139:      main();\nconvert_gateway_config_gemini.test.cjs:150:      main();\nconvert_gateway_config_gemini.test.cjs:162:      main();\nconvert_gateway_config_gemini.test.cjs:172:      main();\nconvert_gateway_config_gemini.test.cjs:185:      main();\nconvert_gateway_config_gemini.test.cjs:195:      main();\nconvert_gateway_config_gemini.test.cjs:206:      main();\nconvert_gateway_config_gemini.test.cjs:215:      main();\nconvert_gateway_config_gemini.test.cjs:225:      main();\nconvert_gateway_config_gemini.test.cjs:234:      main();\nconvert_gateway_config_gemini.test.cjs:243:      main();\n<shellId: 31 completed with exit code 0>","detailedContent":"grep: convert_gateway_config_claude.test.cjs: No such file or directory\ngrep: convert_gateway_config_codex.test.cjs: No such file or directory\nconvert_gateway_config_gemini.test.cjs:139:      main();\nconvert_gateway_config_gemini.test.cjs:150:      main();\nconvert_gateway_config_gemini.test.cjs:162:      main();\nconvert_gateway_config_gemini.test.cjs:172:      main();\nconvert_gateway_config_gemini.test.cjs:185:      main();\nconvert_gateway_config_gemini.test.cjs:195:      main();\nconvert_gateway_config_gemini.test.cjs:206:      main();\nconvert_gateway_config_gemini.test.cjs:215:      main();\nconvert_gateway_config_gemini.test.cjs:225:      main();\nconvert_gateway_config_gemini.test.cjs:234:      main();\nconvert_gateway_config_gemini.test.cjs:243:      main();\n<shellId: 31 completed with exit code 0>"}}}
    {"type":"assistant.message","timestamp":"2026-08-05T23:09:25.500Z","data":{"content":"Now launching the grumpy-coder sub-agent while I continue my own analysis."}}
    {"type":"tool.execution_start","timestamp":"2026-08-05T23:09:25.503Z","data":{"toolName":"task","mcpServerName":""}}
    {"type":"subagent.started","timestamp":"2026-08-05T23:09:25.515Z","data":{"agentName":"general-purpose","agentDisplayName":"General Purpose Agent","toolCallId":"toolu_01APuLYJi5hnxLGaGrJtcNc6"}}
    [copilot-sdk-driver] [sdk-driver] error: Execution failed: Error: No model available. Check policy enablement under GitHub Settings > Copilot
    {"type":"subagent.completed","timestamp":"2026-08-05T23:09:25.568Z","data":{"agentName":"general-purpose","toolCallId":"toolu_01APuLYJi5hnxLGaGrJtcNc6"}}
    {"type":"tool.execution_complete","timestamp":"2026-08-05T23:09:25.599Z","data":{"toolName":"task","mcpServerName":"","success":false}}
    

    Generated from PR Code Quality Reviewer · 92.2 AIC · ◷

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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