{"type":"tool.execution_complete","timestamp":"2026-08-02T17:53:26.795Z","data":{"toolName":"bash","mcpServerName":"","success":true,"result":{"content":"---\nname: go-linters\ndescription: Add and validate custom Go analysis linters in gh-aw.\n---\n\n# Go Linters\n\nUse this guide when adding a new custom Go analysis linter in this repository.\n\nFor PR-driven linter generation (derive a rule from a specific pull request pattern), use `.github/skills/pr-to-go-linter/SKILL.md`.\n\n## Where to add a new linter\n\n1. Create a new package under `pkg/linters/<linter-name>/`.\n2. Define an analyzer in that package (exported as `Analyzer`).\n3. Add tests in the same package using `analysistest` with fixtures under `testdata/src/...`.\n4. Register the analyzer in `cmd/linters/main.go` so it runs via the multichecker binary.\n\n## Build and test linters\n\n- Test only your linter package:\n - `go test ./pkg/linters/<linter-name>/...`\n- Build the custom linter runner:\n - `go build ./cmd/linters`\n- Run all custom linters across the repo:\n - `make golint-custom`\n\n`make golint-custom` builds `cmd/linters` and runs it against `./cmd/...` and `./pkg/...`.\n<shellId: 38 completed with exit code 0>","detailedContent":"---\nname: go-linters\ndescription: Add and validate custom Go analysis linters in gh-aw.\n---\n\n# Go Linters\n\nUse this guide when adding a new custom Go analysis linter in this repository.\n\nFor PR-driven linter generation (derive a rule from a specific pull request pattern), use `.github/skills/pr-to-go-linter/SKILL.md`.\n\n## Where to add a new linter\n\n1. Create a new package under `pkg/linters/<linter-name>/`.\n2. Define an analyzer in that package (exported as `Analyzer`).\n3. Add tests in the same package using `analysistest` with fixtures under `testdata/src/...`.\n4. Register the analyzer in `cmd/linters/main.go` so it runs via the multichecker binary.\n\n## Build and test linters\n\n- Test only your linter package:\n - `go test ./pkg/linters/<linter-name>/...`\n- Build the custom linter runner:\n - `go build ./cmd/linters`\n- Run all custom linters across the repo:\n - `make golint-custom`\n\n`make golint-custom` builds `cmd/linters` and runs it against `./cmd/...` and `./pkg/...`.\n<shellId: 38 completed with exit code 0>"}}}
{"type":"assistant.message","timestamp":"2026-08-02T17:53:33.057Z","data":{"content":""}}
{"type":"tool.execution_start","timestamp":"2026-08-02T17:53:33.059Z","data":{"toolName":"bash","mcpServerName":"","command":"cd /home/runner/work/gh-aw/gh-aw && find pkg/linters/largefunc -type f | xargs -I{} echo {}; echo ---; cat pkg/linters/largefunc/largefunc.go | head -60"}}
{"type":"tool.execution_complete","timestamp":"2026-08-02T17:53:33.144Z","data":{"toolName":"bash","mcpServerName":"","success":true,"result":{"content":"pkg/linters/largefunc/largefunc.go\npkg/linters/largefunc/largefunc_test.go\npkg/linters/largefunc/testdata/src/a/a.go\npkg/linters/largefunc/testdata/src/a/a_test.go\n---\n// Package largefunc implements a Go analysis linter that flags functions\n// whose body exceeds a configurable line threshold.\npackage largefunc\n\nimport (\n\t\"go/ast\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/analysis/passes/inspect\"\n\n\t\"github.com/github/gh-aw/pkg/linters/internal/astutil\"\n\t\"github.com/github/gh-aw/pkg/linters/internal/filecheck\"\n\t\"github.com/github/gh-aw/pkg/linters/internal/nolint\"\n\t\"github.com/github/gh-aw/pkg/logger\"\n)\n\nvar pkgLog = logger.New(\"linters:largefunc\")\n\n// DefaultMaxLines is the default maximum number of lines allowed in a function body.\nconst DefaultMaxLines = 60\n\n// Analyzer is the large-function analysis pass.\nvar Analyzer = &analysis.Analyzer{\n\tName: \"largefunc\",\n\tDoc: \"reports functions whose body exceeds the line limit (default 60 lines)\",\n\tURL: \"https://github.com/github/gh-aw/tree/main/pkg/linters/largefunc\",\n\tRequires: []*analysis.Analyzer{inspect.Analyzer, nolint.Analyzer, filecheck.Analyzer},\n\tRun: run,\n}\n\n// maxLines is the configurable threshold. It is set via the -largefunc.max-lines flag.\nvar maxLines int\n\nfunc init() {\n\tAnalyzer.Flags.IntVar(&maxLines, \"max-lines\", DefaultMaxLines,\n\t\t\"maximum number of lines permitted in a function body\")\n}\n\nfunc run(pass *analysis.Pass) (any, error) {\n\tpkgLog.Printf(\"analyzing package %s (max-lines=%d)\", pass.Pkg.Path(), maxLines)\n\n\tinsp, err := astutil.Inspector(pass)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tnoLintIndex, err := nolint.Index(pass)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tgeneratedFiles, err := filecheck.Index(pass)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tnodeFilter := []ast.Node{(*ast.FuncDecl)(nil), (*ast.FuncLit)(nil)}\n\tinsp.Preorder(nodeFilter, func(n ast.Node) {\n\t\tcheckFuncBodyLength(pass, n, generatedFiles, noLintIndex)\n\t})\n\treturn nil, nil\n}\n<shellId: 39 completed with exit code 0>","detailedContent":"pkg/linters/largefunc/largefunc.go\npkg/linters/largefunc/largefunc_test.go\npkg/linters/largefunc/testdata/src/a/a.go\npkg/linters/largefunc/testdata/src/a/a_test.go\n---\n// Package largefunc implements a Go analysis linter that flags functions\n// whose body exceeds a configurable line threshold.\npackage largefunc\n\nimport (\n\t\"go/ast\"\n\n\t\"golang.org/x/tools/go/analysis\"\n\t\"golang.org/x/tools/go/analysis/passes/inspect\"\n\n\t\"github.com/github/gh-aw/pkg/linters/internal/astutil\"\n\t\"github.com/github/gh-aw/pkg/linters/internal/filecheck\"\n\t\"github.com/github/gh-aw/pkg/linters/internal/nolint\"\n\t\"github.com/github/gh-aw/pkg/logger\"\n)\n\nvar pkgLog = logger.New(\"linters:largefunc\")\n\n// DefaultMaxLines is the default maximum number of lines allowed in a function body.\nconst DefaultMaxLines = 60\n\n// Analyzer is the large-function analysis pass.\nvar Analyzer = &analysis.Analyzer{\n\tName: \"largefunc\",\n\tDoc: \"reports functions whose body exceeds the line limit (default 60 lines)\",\n\tURL: \"https://github.com/github/gh-aw/tree/main/pkg/linters/largefunc\",\n\tRequires: []*analysis.Analyzer{inspect.Analyzer, nolint.Analyzer, filecheck.Analyzer},\n\tRun: run,\n}\n\n// maxLines is the configurable threshold. It is set via the -largefunc.max-lines flag.\nvar maxLines int\n\nfunc init() {\n\tAnalyzer.Flags.IntVar(&maxLines, \"max-lines\", DefaultMaxLines,\n\t\t\"maximum number of lines permitted in a function body\")\n}\n\nfunc run(pass *analysis.Pass) (any, error) {\n\tpkgLog.Printf(\"analyzing package %s (max-lines=%d)\", pass.Pkg.Path(), maxLines)\n\n\tinsp, err := astutil.Inspector(pass)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tnoLintIndex, err := nolint.Index(pass)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tgeneratedFiles, err := filecheck.Index(pass)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tnodeFilter := []ast.Node{(*ast.FuncDecl)(nil), (*ast.FuncLit)(nil)}\n\tinsp.Preorder(nodeFilter, func(n ast.Node) {\n\t\tcheckFuncBodyLength(pass, n, generatedFiles, noLintIndex)\n\t})\n\treturn nil, nil\n}\n<shellId: 39 completed with exit code 0>"}}}
{"type":"assistant.message","timestamp":"2026-08-02T17:54:07.717Z","data":{"content":"Selecting **`unchecked-flush-return`**: flags ignored error return values from `Flush()` calls (e.g. `bufio.Writer`, `tabwriter.Writer`), mirroring the existing \"ignored error\" linter family (`strconvparseignorederror`, `jsonmarshalignoredeerror`). Confirmed 2+ unchecked occurrences in `pkg/cli/logs_format_compact.go`, `errcheck` is disabled repo-wide, and no existing linter covers `Flush()`. Low false-positive risk, high signal."}}
{"type":"tool.execution_start","timestamp":"2026-08-02T17:54:07.719Z","data":{"toolName":"task","mcpServerName":""}}
{"type":"subagent.started","timestamp":"2026-08-02T17:54:07.730Z","data":{"agentName":"general-purpose","agentDisplayName":"General Purpose Agent","toolCallId":"toolu_015eRa9qFewBrDHRhLy4HX6g"}}
[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-02T17:54:07.781Z","data":{"agentName":"general-purpose","toolCallId":"toolu_015eRa9qFewBrDHRhLy4HX6g"}}
{"type":"tool.execution_complete","timestamp":"2026-08-02T17:54:07.811Z","data":{"toolName":"task","mcpServerName":"","success":false}}
Workflow Failure
Workflow: Linter Miner
Branch: main
Run: https://github.com/github/gh-aw/actions/runs/30759473080
Warning
Engine Failure: The
copilotengine terminated unexpectedly.Last agent output:
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.):
Manually invoke the agent
Debug this workflow failure using your favorite Agent CLI and the
agentic-workflowsprompt.agentic-workflowsskill from.github/skills/agentic-workflows/SKILL.mdor https://github.com/github/gh-aw/blob/main/.github/skills/agentic-workflows/SKILL.mddebug the agentic workflow linter-miner failure in https://github.com/github/gh-aw/actions/runs/30759473080Tip
Stop reporting this workflow as a failure
To stop a workflow from creating failure issues, set
report-failure-as-issue: falsein its frontmatter: