Skip to content

[linter-miner] feat(linters): add ioutildeprecated linter to flag deprecated io/ioutil usage#44998

Merged
pelikhan merged 7 commits into
mainfrom
linter-miner/ioutildeprecated-c8e0c4cd0482d7b4
Jul 13, 2026
Merged

[linter-miner] feat(linters): add ioutildeprecated linter to flag deprecated io/ioutil usage#44998
pelikhan merged 7 commits into
mainfrom
linter-miner/ioutildeprecated-c8e0c4cd0482d7b4

Conversation

@github-actions

@github-actions github-actions Bot commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds a new custom Go analysis linter, ioutildeprecated, that flags references to the deprecated io/ioutil package (deprecated since Go 1.16) and reports the modern io or os replacement for each symbol.

Changes

File Change
cmd/linters/main.go Registers ioutildeprecated.Analyzer in the linter runner
pkg/linters/ioutildeprecated/ioutildeprecated.go New 123-line analyzer implementation
pkg/linters/ioutildeprecated/ioutildeprecated_test.go analysistest-based unit test
pkg/linters/ioutildeprecated/testdata/src/ioutildeprecated/ioutildeprecated.go Test fixture: 8 bad cases + 4 good cases
pkg/linters/ioutildeprecated/testdata/src/ioutildeprecated/dot_import.go Test fixture: 3 bad cases via dot-import
docs/adr/44998-add-ioutildeprecated-linter.md Draft ADR documenting decision and alternatives

Behavior

  • Replacements map covers all 8 deprecated ioutil symbols: ReadAllio.ReadAll, ReadFileos.ReadFile, WriteFileos.WriteFile, TempFileos.CreateTemp, TempDiros.MkdirTemp, ReadDiros.ReadDir, NopCloserio.NopCloser, Discardio.Discard.
  • Detects both qualified usage (ioutil.ReadAll(r)) via ast.SelectorExpr traversal and dot-import usage (ReadAll(r) after . "io/ioutil") via ast.Ident traversal with TypesInfo.Uses resolution.
  • Uses type-system resolution (pass.TypesInfo) so arbitrary import aliases (e.g., import ioutil2 "io/ioutil") are handled correctly.
  • Skips test files (filecheck.IsTestFile) and respects nolint:ioutildeprecated directives.
  • Purely preventive: no existing usages were found in pkg/ or cmd/ at time of addition.

Diagnostic format

ioutil.ReadAll is deprecated; use io.ReadAll instead

Alternatives considered

  • staticcheck SA1019 — not chosen; project owns its linter suite for actionable messages and nolint semantics.
  • golangci-lint depguard/forbidigo — not chosen; same reason plus import-level blocking conflicts with test fixtures.

ADR

See docs/adr/44998-add-ioutildeprecated-linter.md (status: Draft).

Generated by PR Description Updater for #44998 · 39.3 AIC · ⌖ 5.63 AIC · ⊞ 4.7K ·

Flags calls to deprecated io/ioutil functions (deprecated since Go 1.16)
and reports the io or os package replacements:

- ioutil.ReadAll   → io.ReadAll
- ioutil.ReadFile  → os.ReadFile
- ioutil.WriteFile → os.WriteFile
- ioutil.TempFile  → os.CreateTemp
- ioutil.TempDir   → os.MkdirTemp
- ioutil.ReadDir   → os.ReadDir
- ioutil.NopCloser → io.NopCloser
- ioutil.Discard   → io.Discard

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor Author

Great addition from the Linter Miner workflow! 🎉 This ioutildeprecated linter is a clean, well-scoped contribution — it targets a clear and well-understood deprecation (io/ioutil since Go 1.16), includes a full test file with testdata fixtures, registers the analyzer in cmd/linters/main.go, and comes with a thorough PR description covering motivation and evidence of no existing violations. This looks ready for review.

Generated by ✅ Contribution Check · 97 AIC · ⌖ 12.9 AIC · ⊞ 6.2K ·

@pelikhan pelikhan marked this pull request as ready for review July 12, 2026 08:34
Copilot AI review requested due to automatic review settings July 12, 2026 08:34
@github-actions

github-actions Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor Author

Test Quality Sentinel completed test quality analysis.

@github-actions

github-actions Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor Author

Design Decision Gate 🏗️ completed the design decision gate check.

@github-actions

github-actions Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor Author

🧠 Matt Pocock Skills Reviewer has completed the skills-based review. ✅

@github-actions

github-actions Bot commented Jul 12, 2026

Copy link
Copy Markdown
Contributor Author

PR Code Quality Reviewer completed the code quality review.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a custom Go analyzer that detects deprecated io/ioutil APIs and recommends modern replacements.

Changes:

  • Implements and registers ioutildeprecated.
  • Adds analysistest coverage and fixtures.
  • Two gaps remain: dot imports and incomplete replacement assertions.
Show a summary per file
File Description
cmd/linters/main.go Registers the analyzer.
pkg/linters/ioutildeprecated/ioutildeprecated.go Implements deprecated API detection.
pkg/linters/ioutildeprecated/ioutildeprecated_test.go Runs analyzer tests.
pkg/linters/ioutildeprecated/testdata/src/ioutildeprecated/ioutildeprecated.go Provides test fixtures.

Review details

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 4/4 changed files
  • Comments generated: 2
  • Review effort level: Medium

}
noLintLinesByFile := nolint.BuildLineIndex(pass, "ioutildeprecated")

for cur := range root.Preorder((*ast.SelectorExpr)(nil)) {

funcName := sel.Sel.Name
if replacement, found := replacements[funcName]; found {
pass.ReportRangef(sel, "ioutil.%s is deprecated; use %s instead", funcName, replacement)

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Skills-Based Review

Applied /tdd - requesting changes on test coverage gaps.

Key Themes

  • Missing test cases: NopCloser and Discard are in the replacements map but absent from the test fixture, leaving their detection unverified.
  • Weak negative test: GoodReadAll does not actually call io.ReadAll, so it does not confirm the modern API produces no warning.

Positive Highlights

  • Clean type-based detection using types.PkgName - robust against aliased imports.
  • Correctly skips test files and respects nolint directives via shared internal utilities.
  • Error messages are clear and actionable.
  • Follows the established analyzer pattern consistently with other linters.

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · 25.9 AIC · ⌖ 4.52 AIC · ⊞ 6.6K
Comment /matt to run again

defer f.Close()
// Using io.ReadAll is fine
_ = f
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/tdd] NopCloser and Discard are in the replacements map but have no corresponding test fixtures — so their detection is untested.

💡 Suggested additions
func BadNopCloser() {
    r := strings.NewReader("hello")
    _ = ioutil.NopCloser(r) // want `ioutil\.NopCloser is deprecated`
}

func BadDiscard() {
    _, _ = fmt.Fprintf(ioutil.Discard, "hello") // want `ioutil\.Discard is deprecated`
}

Without these cases the analyzer could silently stop reporting them and the test suite would still pass.

@copilot please address this.


func BadReadDir() {
_, _ = ioutil.ReadDir(".") // want `ioutil\.ReadDir is deprecated`
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[/tdd] The GoodReadAll negative test doesn't actually call io.ReadAll — it opens a file and discards it, so it doesn't demonstrate that the modern replacement is accepted correctly.

💡 Suggested fix
func GoodReadAll() {
    f, _ := os.Open("file.txt")
    defer f.Close()
    _, _ = io.ReadAll(f) // no diagnostic expected — this is the modern API
}

This makes the test a genuine specification: "using io.ReadAll produces no warning."

@copilot please address this.

@github-actions

Copy link
Copy Markdown
Contributor Author

🧪 Test Quality Sentinel Report

Test Quality Score: 88/100 — Excellent

Analyzed 1 test(s): 1 design, 0 implementation, 0 violation(s).

📊 Metrics (1 test)
Metric Value
Analyzed 1 (Go: 1, JS: 0)
✅ Design 1 (100%)
⚠️ Implementation 0 (0%)
Edge/error coverage 1 (100%)
Duplicate clusters 0
Inflation No
🚨 Violations 0
Test File Classification Issues
TestIoutilDeprecated pkg/linters/ioutildeprecated/ioutildeprecated_test.go:13 design_test Minor: NopCloser and Discard replacements not covered in testdata

Notes

  • ✅ Build tag //go:build !integration present on line 1.
  • ✅ Uses analysistest.Run with // want directive-driven testdata — canonical pattern for Go analyzer tests. Verifies diagnostic messages for 6 of 8 deprecated ioutil functions.
  • ✅ Testdata includes a GoodReadAll function verifying no false positives (edge-case credit).
  • ⚠️ NopCloser and Discard are in the replacements map but absent from testdata, leaving a minor behavioral gap. Consider adding them to testdata/src/ioutildeprecated/ioutildeprecated.go.
  • ✅ No test inflation: 16 lines added to test vs. 83 lines in production (ratio 0.19:1).
  • ✅ No mock library usage.

Verdict

Passed. 0% implementation tests (threshold: 30%). No violations.

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • awmgmcpg

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "awmgmcpg"

See Network Configuration for more information.

🧪 Test quality analysis by Test Quality Sentinel · 24.7 AIC · ⌖ 15.7 AIC · ⊞ 6.8K ·
Comment /review to run again

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Test Quality Sentinel: 88/100. 0% implementation tests (threshold: 30%). No violations.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: ioutildeprecated linter

Overall the implementation is clean and follows existing linter patterns correctly. One non-blocking issue found:

Missing test coverage for NopCloser and Discard — the replacements map has 8 entries but the testdata file only exercises 6. See the inline comment for suggested additions.

Everything else looks good: type-resolution via types.PkgName is correct and avoids false positives from local ioutil-named variables; nolint and filecheck integrations follow the established pattern; registration order in main.go is alphabetically correct.

🧵 Reviewed using Impeccable skills by Impeccable Skills Reviewer · 19.7 AIC · ⌖ 4.4 AIC · ⊞ 4.8K

defer f.Close()
// Using io.ReadAll is fine
_ = f
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The testdata file covers 6 of the 8 entries in replacements but is missing test cases for NopCloser and Discard. Without these, the linter could silently fail to fire (or fire incorrectly) for those two entries. Please add cases such as:

func BadNopCloser() {
	r := strings.NewReader("")
	_ = ioutil.NopCloser(r) // want `ioutil\.NopCloser is deprecated`
}

func BadDiscard() {
	_, _ = io.Copy(ioutil.Discard, strings.NewReader("")) // want `ioutil\.Discard is deprecated`
}

@copilot please address this.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Non-blocking observations on ioutildeprecated

The linter logic is correct and the type-based package detection approach is sound. Four issues worth fixing before or after merge:

Findings summary
  1. Analyzer list ordering (cmd/linters/main.go:87) — ioutildeprecated was inserted before httpstatuscode, breaking alphabetical order; it belongs after all http* entries.
  2. Missing fixtures for NopCloser and Discard — two replacements map entries have no testdata coverage, so regressions won't be caught.
  3. pass.TypesInfo == nil inside the hot loop — should be a single guard at the top of run(), not a per-node check.
  4. GoodReadAll fixture is a no-op — it doesn't call any ioutil or io symbol, so it doesn't verify the linter's silence on modern APIs.

🔎 Code quality review by PR Code Quality Reviewer · 41.2 AIC · ⌖ 4.73 AIC · ⊞ 5.4K
Comment /review to run again

Comments that could not be inline-anchored

cmd/linters/main.go:87

Alphabetical ordering broken: ioutildeprecated is inserted before httpstatuscode, but 'i' sorts after 'h' — this violates the alphabetical convention all other entries follow.

<details>
<summary>💡 Fix</summary>

Move the registration so the list reads:

httprespbodyclose.Analyzer,
httpstatuscode.Analyzer,
ioutildeprecated.Analyzer,  // ← after all http* entries
largefunc.Analyzer,

The full list uses strict alphabetical ordering; keeping it sorted makes future insertions pre…

pkg/linters/ioutildeprecated/testdata/src/ioutildeprecated/ioutildeprecated.go:39

Missing test fixtures for NopCloser and Discard: both entries are in the replacements map but have zero coverage in the testdata file — any regression in detecting them goes unnoticed.

<details>
<summary>💡 Suggested additions</summary>

Add to the testdata file:

func BadNopCloser() {
    r := strings.NewReader(&quot;hello&quot;)
    _ = ioutil.NopCloser(r) // want `ioutil\.NopCloser is deprecated`
}

func BadDiscard() {
    _, _ = io.Copy(ioutil.Discard, strings.NewReader(&quot;hi&quot;)) // want …

</details>

<details><summary>pkg/linters/ioutildeprecated/ioutildeprecated.go:90</summary>

**`pass.TypesInfo == nil` check belongs at the top of `run()`, not inside the loop**: `TypesInfo` is set by the analysis framework before `Run` is called and will never be nil in a valid pass. Checking it on every `SelectorExpr` node is dead-branch overhead.

&lt;details&gt;
&lt;summary&gt;💡 Fix&lt;/summary&gt;

Move the guard to the top of `run()`:

```go
func run(pass *analysis.Pass) (any, error) {
    if pass.TypesInfo == nil {
        return nil, nil
    }
    root, err := astutil.Root(pass)
    // ...

pkg/linters/ioutildeprecated/testdata/src/ioutildeprecated/ioutildeprecated.go:37

GoodReadAll doesn't test the actual true-negative case: the function opens a file and assigns to blank but never calls io.ReadAll or any ioutil symbol. It doesn't verify the linter stays silent when modern APIs are used.

<details>
<summary>💡 Suggested improvement</summary>

Replace with something that actually exercises the linter's non-flagging path:

func GoodReadAll() {
    f, _ := os.Open(&quot;file.txt&quot;)
    defer f.Close()
    _, _ = io.ReadAll(f) // no diagnostic expected
}
``</details>

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor Author

Design Decision Gate - ADR Required

This PR makes significant changes to core business logic (138 new lines in pkg/ and cmd/) but did not have a linked Architecture Decision Record (ADR).

Draft ADR committed: docs/adr/44998-add-ioutildeprecated-linter.md - review and complete it before merging.

This PR cannot merge until an ADR is linked in the PR body.

What to do next
  1. Review the draft ADR committed to your branch - it was generated from the PR diff
  2. Complete the missing sections - add context the AI could not infer, refine the decision rationale, and list real alternatives you considered
  3. Commit the finalized ADR to docs/adr/ on your branch
  4. Reference the ADR in this PR body by adding a line such as: ADR: ADR-44998: Add ioutildeprecated Linter

Once an ADR is linked in the PR body, this gate will re-run and verify the implementation matches the decision.

Why ADRs Matter

ADRs create a searchable, permanent record of why the codebase looks the way it does. Future contributors (and your future self) will thank you.

Michael Nygard ADR Format Reference

An ADR must contain these four sections to be considered complete:

  • Context - What is the problem? What forces are at play?
  • Decision - What did you decide? Why?
  • Alternatives Considered - What else could have been done?
  • Consequences - What are the trade-offs (positive and negative)?

All ADRs are stored in docs/adr/ as Markdown files numbered by PR number.

🏗️ ADR gate enforced by Design Decision Gate 🏗️ · 44.5 AIC · ⌖ 7 AIC · ⊞ 8.5K ·
Comment /review to run again

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot please run the pr-finisher skill, address any unresolved review feedback, and rerun checks once the branch is up to date.

Run: https://github.com/github/gh-aw/actions/runs/29187567992

Generated by 👨‍🍳 PR Sous Chef · 6.21 AIC · ⌖ 8.01 AIC · ⊞ 7.5K ·
Comment /souschef to run again

Copilot AI and others added 2 commits July 12, 2026 09:51
…stic assertions

- Add second Ident-walk loop that uses TypesInfo.Uses to detect io/ioutil
  symbols imported via `import . "io/ioutil"` (bare identifiers, no selector)
- Add dot_import.go test fixture exercising ReadAll, ReadFile, WriteFile via
  dot import
- Extend all want-patterns to assert the full diagnostic message including
  the replacement (e.g. `use io.ReadAll instead`)
- Add NopCloser and Discard test cases (previously untested)
- Replace GoodReadAll stub with real modern-API good cases (io.ReadAll,
  os.ReadFile, os.WriteFile, io.Discard)
- Use named fileMode constant in good-case fixture to satisfy the repo-wide
  no-raw-octal-permission-literal policy

Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>
…e in fixture

Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>

Copilot AI commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

@copilot please run the pr-finisher skill, address any unresolved review feedback still open on this PR, and rerun checks once the branch is ready.

Run: https://github.com/github/gh-aw/actions/runs...

All review threads from the previous session are already addressed in commits 2b33b24 and a83fb2a. Local make fmt, make lint, and make test-unit all pass cleanly. No new unresolved feedback remains.

CI needs a human re-trigger (close/reopen or workflow_dispatch) to run against the latest HEAD before merge.

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

\n@copilot please run the skill, address the unresolved review feedback on dot-import handling and missing/weak replacement tests for , then rerun checks once the branch is ready.

Generated by 👨‍🍳 PR Sous Chef · 8.41 AIC · ⌖ 10.8 AIC · ⊞ 4.2K ·
Comment /souschef to run again

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot please run the pr-finisher skill, address the unresolved review feedback on this PR, and rerun checks when done. Unresolved threads to handle first (newest first):

Generated by 👨‍🍳 PR Sous Chef · 13.9 AIC · ⌖ 7.31 AIC · ⊞ 7.5K ·
Comment /souschef to run again

Copilot AI commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

\n@copilot please run the skill, address the unresolved review feedback on dot-import handling and missing/weak replacement tests for , then rerun checks once the branch is ready.

...

All of this is already in the current HEAD. Commits 2b33b24 and a83fb2a address dot-import detection (second *ast.Ident walk via TypesInfo.Uses, dot_import.go fixture) and full replacement assertions for all eight entries including NopCloser and Discard. make test-unit passes cleanly.

@copilot please run the pr-finisher skill, address the unresolved review feedback on this PR, and rerun checks when done. Unresolved threads to handle first (newest first):

  • reviewer github-actions...

All five threads are addressed in commits 2b33b24 and a83fb2a:

  • r3565964266 / r3565964277 (dot imports + weak assertions on ioutildeprecated.go): Added a second *ast.Ident walk using TypesInfo.Uses to catch import . "io/ioutil" usage; added dot_import.go fixture; all eight want patterns now assert the full message including the replacement.
  • r3565968731 / r3565969672 / r3565968734 (NopCloser/Discard untested, GoodReadAll stub): BadNopCloser and BadDiscard cases added to the fixture; GoodReadAll now calls io.ReadAll.

go test ./pkg/linters/ioutildeprecated/... passes. CI needs a human re-trigger to confirm on HEAD.

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

\n@copilot please run the skill, address any unresolved review feedback, and rerun checks once the branch is up to date.

Generated by 👨‍🍳 PR Sous Chef · 6.24 AIC · ⌖ 5.58 AIC · ⊞ 7.5K ·
Comment /souschef to run again

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot please run the pr-finisher skill, address unresolved review feedback, and rerun checks once the branch is up to date.

Generated by 👨‍🍳 PR Sous Chef · 10.1 AIC · ⌖ 6.32 AIC · ⊞ 7.5K ·
Comment /souschef to run again

Copilot AI commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

@copilot please run the pr-finisher skill, address unresolved review feedback, and rerun checks once the branch is up to date.

...

All review feedback was already addressed in commits 2b33b24 and a83fb2a. Here's the current state:

  • Reviews — All five open threads are addressed: dot-import detection via TypesInfo.Uses (dot_import.go fixture added), full want assertions for all 8 deprecated entries including NopCloser and Discard, and GoodReadAll now calls io.ReadAll.
  • Checks (local)make fmt, make lint, make test-unit all pass cleanly on HEAD.
  • Checks (CI) — Stale after the last agent push. Needs human re-trigger (close/reopen or workflow_dispatch).
  • Mergeable — Branch is up to date; no conflicts.

Hand-off: CI must be re-triggered by a maintainer before merge.

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot please run the pr-finisher skill, address any unresolved review feedback, and rerun checks once the branch is up to date.

Generated by PR Sous Chef run https://github.com/github/gh-aw/actions/runs/29204847475

Generated by 👨‍🍳 PR Sous Chef · 13.1 AIC · ⌖ 6.58 AIC · ⊞ 5.1K ·
Comment /souschef to run again

Copilot AI commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

@copilot please run the pr-finisher skill, address any unresolved review feedback, and rerun checks once the branch is up to date.

Generated by PR Sous Chef run https://github.com/github/gh-aw/ac...

No new feedback to address. All five open threads remain covered by commits 2b33b24 and a83fb2a:

  • Dot-import detection via TypesInfo.Uses + dot_import.go fixture
  • Full want assertions for all 8 deprecated entries including NopCloser and Discard
  • GoodReadAll calls io.ReadAll; BadNopCloser and BadDiscard cases both present

Branch is up to date, nothing uncommitted. make fmt, make lint, make test-unit all pass. CI needs a human re-trigger (close/reopen or workflow_dispatch) before merge.

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

Copilot AI commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

@copilot please run the pr-finisher skill, address the unresolved review feedback, and rerun checks once the branch is up to date.

Unresolved review threads (newest first):...

All five threads are already addressed in commits 2b33b24 and a83fb2a:

  • r3565964266 — dot-import detection added via TypesInfo.Uses second walk + dot_import.go fixture
  • r3565964277 — full want assertions for all 8 deprecated entries (replacement text included)
  • r3565968731 / r3565969672BadNopCloser and BadDiscard test cases present in fixture
  • r3565968734GoodReadAll calls io.ReadAll

make fmt, make lint, make test-unit all pass on HEAD. Branch is up to date with no uncommitted changes. CI needs a human re-trigger before merge.

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot please run the pr-finisher skill, address unresolved review feedback, refresh the branch if needed, and rerun checks once updates are ready.

Generated by 👨‍🍳 PR Sous Chef · 4.05 AIC · ⌖ 7.38 AIC · ⊞ 7.5K ·
Comment /souschef to run again

…precated-c8e0c4cd0482d7b4

Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>

Copilot AI commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

@copilot please run the pr-finisher skill, address unresolved review feedback, refresh the branch if needed, and rerun checks once updates are ready.

...

Branch refreshed — merged latest main in commit ae35d80. All five review threads remain addressed (2b33b24, a83fb2a). Tests pass on the updated HEAD. CI needs a human re-trigger before merge.

@pelikhan pelikhan merged commit ea7a49e into main Jul 13, 2026
@pelikhan pelikhan deleted the linter-miner/ioutildeprecated-c8e0c4cd0482d7b4 branch July 13, 2026 06:26
@github-actions

Copy link
Copy Markdown
Contributor Author

🎉 This pull request is included in a new release.

Release: v0.82.9

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

Labels

automation cookie Issue Monster Loves Cookies! go-linters

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants