Skip to content

[linter-miner] feat(linters): add stringbytesroundtrip linter#47375

Merged
pelikhan merged 5 commits into
mainfrom
linter-miner/stringbytesroundtrip-c93b0c9cf4ee201b
Jul 22, 2026
Merged

[linter-miner] feat(linters): add stringbytesroundtrip linter#47375
pelikhan merged 5 commits into
mainfrom
linter-miner/stringbytesroundtrip-c93b0c9cf4ee201b

Conversation

@github-actions

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

Copy link
Copy Markdown
Contributor

Summary

Adds a new custom Go analysis linter, stringbytesroundtrip, to the pkg/linters/ registry. The analyzer flags redundant string([]byte(s)) and []byte(string(b)) round-trip type conversions where the outer type is identical to the inner argument type, causing a wasteful intermediate allocation with no semantic effect.

Changes

New analyzer: pkg/linters/stringbytesroundtrip/

  • stringbytesroundtrip.gogo/analysis pass that traverses the AST for nested CallExpr nodes, verifies both the outer and inner nodes are type conversions (not function calls) using TypesInfo, checks the underlying types form a string→[]byte→string or []byte→string→[]byte round-trip, and reports a diagnostic. Respects //nolint:stringbytesroundtrip directives and skips generated files via the shared nolint and filecheck passes.
  • stringbytesroundtrip_test.goanalysistest-based unit test.
  • testdata/src/stringbytesroundtrip/stringbytesroundtrip.go — test corpus covering valid single-step conversions, redundant round-trips on plain and named types, and function calls that must not be flagged.

Registry and documentation updates

File Change
pkg/linters/registry.go Imports and registers stringbytesroundtrip.Analyzer in All()
pkg/linters/spec_test.go Adds stringbytesroundtrip to documentedAnalyzers(); updates count 56 → 57
pkg/linters/doc.go Updates package doc comment 56 → 57 active analyzers
pkg/linters/README.md Adds stringbytesroundtrip to the subpackage list, table, and import list
docs/adr/47375-add-stringbytesroundtrip-linter.md Draft ADR documenting context, decision, alternatives, and consequences

Detection logic

  • Both outer and inner call nodes must be single-argument type conversions (verified via TypesInfo.Types[fun].IsType(); real function calls and variadic spread are excluded).
  • Uses Underlying() to handle named types (e.g., type myString string) correctly.
  • Flags string([]byte(s)) when s is already a string, and []byte(string(b)) when b is already a []byte.

Test coverage

  • Positive: string([]byte(s)), []byte(string(b)), named-type variants (myString, myBytes).
  • Negative: single-step conversions, named-type single-step conversions, real function calls.

References:

Generated by PR Description Updater for #47375 · sonnet46 54.2 AIC · ⌖ 7.55 AIC · ⊞ 4.8K ·

Adds a new custom Go analysis linter that detects redundant round-trip
type conversions:

- string([]byte(s)) when s is already a string
- []byte(string(b)) when b is already a []byte

Both patterns create a wasteful intermediate copy and leave the caller
with the same underlying type as the input. The linter reports a clear
diagnostic with the inner argument name so the fix is obvious.

The linter follows the standard pkg/linters/<name>/ layout, includes
analysistest fixtures, and is registered in pkg/linters/registry.go.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions github-actions Bot added automation cookie Issue Monster Loves Cookies! go-linters labels Jul 22, 2026
@pelikhan
pelikhan marked this pull request as ready for review July 22, 2026 18:17
Copilot AI review requested due to automatic review settings July 22, 2026 18:17
@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor Author

Test Quality Sentinel completed test quality analysis.

@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor Author

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

@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor Author

⚠️ PR Code Quality Reviewer failed to deliver outputs during code quality review.

@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor Author

🧠 Matt Pocock Skills Reviewer has completed the skills-based 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 for string/byte conversion round trips.

Changes:

  • Implements and registers stringbytesroundtrip.
  • Adds analyzer tests and fixtures.
  • Supports generated-file and nolint exclusions.
Show a summary per file
File Description
pkg/linters/stringbytesroundtrip/stringbytesroundtrip.go Implements detection logic.
pkg/linters/stringbytesroundtrip/stringbytesroundtrip_test.go Runs analyzer tests.
pkg/linters/stringbytesroundtrip/testdata/src/stringbytesroundtrip/stringbytesroundtrip.go Provides test fixtures.
pkg/linters/registry.go Registers the analyzer.

Review details

Tip

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

Comments suppressed due to low confidence (2)

pkg/linters/stringbytesroundtrip/stringbytesroundtrip.go:102

  • []byte(string(b)) is not semantically equivalent to b: the conversions produce a fresh slice, so mutating the result does not mutate b. Treating this as redundant can therefore introduce aliasing bugs. Either omit this pattern or describe it as inefficient cloning and recommend a semantics-preserving replacement such as bytes.Clone(b), with an aliasing test.
	if isByteSliceType(outerUnderlying) && isStringType(pass.TypesInfo.TypeOf(inner).Underlying()) && isByteSliceType(innerArgUnderlying) {

pkg/linters/stringbytesroundtrip/stringbytesroundtrip.go:80

  • The inner CallExpr is also assumed to be a conversion based only on its signature. For example, string(toBytes(s)) is currently flagged whenever toBytes(string) []byte, even if that function transforms the data. Check pass.TypesInfo.Types[inner.Fun].IsType() before classifying the nested call as a round-trip conversion.
	if len(inner.Args) != 1 || inner.Ellipsis.IsValid() {
		return
  • Files reviewed: 4/4 changed files
  • Comments generated: 2
  • Review effort level: Medium

Comment on lines +58 to +60
if len(outer.Args) != 1 || outer.Ellipsis.IsValid() {
return
}

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.

Fixed in commit 413f555. Both the outer and inner CallExpr now use pass.TypesInfo.Types[expr.Fun].IsType() to confirm they are type conversions rather than arbitrary function calls, matching the pattern in bytescomparestring.go:239-243.

Comment thread pkg/linters/registry.go Outdated
ssljson.Analyzer,
seenmapbool.Analyzer,
sortslice.Analyzer,
stringbytesroundtrip.Analyzer,

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.

Fixed in commit 413f555. stringbytesroundtrip is now added to documentedAnalyzers() in spec_test.go, the analyzer count updated to 57 and bullet added in doc.go, and the README subpackage entry added. TestDocSurfacesMatchRegistryAndSpecList and TestRegistryMatchesDocumentation both pass.

@github-actions

Copy link
Copy Markdown
Contributor Author

🧪 Test Quality Sentinel Report

Test Quality Score: 100/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 (0.13:1)
🚨 Violations 0
Test File Classification Notes
TestAnalyzer stringbytesroundtrip_test.go:13 Design, high-value Uses analysistest.Run() with testdata covering both valid conversions and redundant round-trip cases

Verdict

Passed. 0% implementation tests (threshold: 30%). Test follows the standard linter test pattern with complete behavioral coverage via analysistest framework. Testdata includes both positive (good) and negative (bad) cases with diagnostic assertions.

🧪 Test quality analysis by Test Quality Sentinel · haiku45 13.8 AIC · ⌖ 13.8 AIC · ⊞ 7.1K ·
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: 100/100. 0% implementation tests (threshold: 30%). Test follows the standard linter test pattern with comprehensive behavioral coverage via analysistest framework.

@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: stringbytesroundtrip linter

Good addition overall. Two blocking issues found:

  1. Import/All() ordering (registry.go lines 44, 108) — stringbytesroundtrip is alphabetically after all sprintf* packages but is inserted before them, breaking the consistent alphabetical order and make fmt.

  2. Missing .Underlying() for inner byte-slice check (stringbytesroundtrip.go line 86) — the first pattern calls isByteSliceType(pass.TypesInfo.TypeOf(inner)) on the raw type; the second (line 92) correctly uses .Underlying(). Both should be consistent.

🧵 Reviewed using Impeccable skills by Impeccable Skills Reviewer · sonnet46 27.5 AIC · ⌖ 4.75 AIC · ⊞ 5K

Comment thread pkg/linters/registry.go Outdated
"github.com/github/gh-aw/pkg/linters/regexpcompileinfunction"
"github.com/github/gh-aw/pkg/linters/seenmapbool"
"github.com/github/gh-aw/pkg/linters/sortslice"
"github.com/github/gh-aw/pkg/linters/stringbytesroundtrip"

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 import for stringbytesroundtrip is inserted out of alphabetical order. Alphabetically str > spr, so it should appear after all the sprintf* entries (after line 48, sprintfint):

	"github.com/github/gh-aw/pkg/linters/sortslice"
	"github.com/github/gh-aw/pkg/linters/sprintfbool"
	"github.com/github/gh-aw/pkg/linters/sprintferrdot"
	"github.com/github/gh-aw/pkg/linters/sprintferrorsnew"
	"github.com/github/gh-aw/pkg/linters/sprintfint"
	"github.com/github/gh-aw/pkg/linters/stringbytesroundtrip"

@copilot please address this.

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.

Fixed in commit 413f555. The import for stringbytesroundtrip is now correctly placed after strconvparseignorederror (alphabetically after sprintfint and ssljson).

innerArgType := pass.TypesInfo.TypeOf(inner.Args[0])
if innerArgType == nil {
return
}

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.

Inconsistent use of .Underlying() for the byte-slice check in the first pattern vs the second.

Line 86 (first pattern):

if isStringType(outerUnderlying) && isByteSliceType(pass.TypesInfo.TypeOf(inner)) && isStringType(innerArgUnderlying) {

isByteSliceType is called on the raw type of inner, not the underlying type. If the inner conversion returns a named []byte-based type, the check silently misses it. The second pattern (line 92) correctly passes .Underlying(). Fix line 86 to:

if isStringType(outerUnderlying) && isByteSliceType(pass.TypesInfo.TypeOf(inner).Underlying()) && isStringType(innerArgUnderlying) {

@copilot please address this.

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.

Fixed in commit 413f555. innerUnderlying is now pre-computed as innerType.Underlying() and used consistently in both the string([]byte(s)) and []byte(string(b)) checks, so named []byte-based types are handled correctly in both directions.

@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 and /codebase-design — requesting changes on two correctness issues and a test coverage gap.

📋 Key Themes & Highlights

Issues

  • Import ordering (registry.go): stringbytesroundtrip (st...) is placed before sprintfbool/sprintferr* (sp...), breaking alphabetical order in both the import block and All() slice.
  • Type inconsistency (stringbytesroundtrip.go:81): The string([]byte(s)) check calls isByteSliceType on the named type rather than the underlying type, while the symmetric []byte(string(b)) check correctly uses .Underlying(). This can silently miss round-trips through named byte-slice types.
  • Missing edge-case tests: Testdata has no named-type coverage (type MyString string, type MyBytes []byte), so the inconsistency above would not be caught by the test suite.

Positive Highlights

  • ✅ Clear and well-documented linter concept; PR description is excellent
  • ✅ Correct use of astutil, filecheck, and nolint infrastructure
  • ✅ Both positive and negative test cases are present
  • ✅ Early-return guard pattern is clean and consistent

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · sonnet46 40.1 AIC · ⌖ 4.95 AIC · ⊞ 6.7K
Comment /matt to run again

Comment thread pkg/linters/registry.go Outdated
"github.com/github/gh-aw/pkg/linters/regexpcompileinfunction"
"github.com/github/gh-aw/pkg/linters/seenmapbool"
"github.com/github/gh-aw/pkg/linters/sortslice"
"github.com/github/gh-aw/pkg/linters/stringbytesroundtrip"

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.

[/codebase-design] Import ordering is broken: stringbytesroundtrip (st...) is placed before sprintfbool/sprintferr* (sp...), breaking the alphabetically sorted import block. The All() slice has the same issue at line 108.

💡 Fix

Move the stringbytesroundtrip import after all sprintf* imports:

"github.com/github/gh-aw/pkg/linters/sprintfbool"
"github.com/github/gh-aw/pkg/linters/sprintferrdot"
"github.com/github/gh-aw/pkg/linters/sprintferrorsnew"
"github.com/github/gh-aw/pkg/linters/stringbytesroundtrip"

@copilot please address this.

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.

Fixed in commit 413f555. Import ordering is now alphabetically correct — stringbytesroundtrip comes after strconvparseignorederror in both the import block and the All() slice.

}
if len(inner.Args) != 1 || inner.Ellipsis.IsValid() {
return
}

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] isByteSliceType is called with pass.TypesInfo.TypeOf(inner) (the named type, not the underlying) for the string([]byte(s)) check on line 81, but the symmetric check on line 91 correctly calls .Underlying(). This inconsistency could cause the linter to miss a flag when the intermediate []byte is a named type alias (e.g. type MyBytes []byte).

💡 Fix

Change line 81 to be consistent with the rest of the function:

// Before
if isStringType(outerUnderlying) && isByteSliceType(pass.TypesInfo.TypeOf(inner)) && isStringType(innerArgUnderlying) {

// After
if isStringType(outerUnderlying) && isByteSliceType(pass.TypesInfo.TypeOf(inner).Underlying()) && isStringType(innerArgUnderlying) {

Add a testdata case with a named byte-slice type to cover this path.

@copilot please address this.

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.

Fixed in commit 413f555. The string([]byte(s)) check now uses innerUnderlying (computed as innerType.Underlying()) instead of the raw type, making it consistent with the []byte(string(b)) check. Named byte-slice types are now correctly flagged in both directions.

b := []byte{104, 101, 108, 108, 111}

_ = string([]byte(s)) // want `string\(\[\]byte\(s\)\) is a redundant round-trip`
_ = []byte(string(b)) // want `\[\]byte\(string\(b\)\) is a redundant round-trip`

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 test fixture covers only literal string and []byte variables. Named types (e.g. type MyString string, type MyBytes []byte) are not tested, leaving a gap in edge-case coverage.

💡 Suggested additions
type MyString string
type MyBytes []byte

func namedTypes() {
    ms := MyString("hello")
    mb := MyBytes{104, 101, 108, 108, 111}

    // Named string → should be flagged as redundant round-trip
    _ = string([]byte(ms)) // want `redundant round-trip`
    // Named bytes → should be flagged
    _ = []byte(string(mb)) // want `redundant round-trip`

    // Valid conversions should remain OK
    _ = string(mb)
    _ = []byte(ms)
}

This also exercises the isByteSliceType inconsistency noted in the main file.

@copilot please address this.

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.

Fixed in commit 413f555. The test fixture now includes myString and myBytes named types with round-trip cases that are flagged, and single-step conversions that are not flagged. A non-conversion helper function call is also tested to verify the IsType() guard works correctly.

@github-actions

Copy link
Copy Markdown
Contributor Author

🏗️ Design Decision Gate — ADR Required

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

📄 Draft ADR committed: docs/adr/47375-add-stringbytesroundtrip-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-47375: Add stringbytesroundtrip Custom Go Analysis 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 (e.g., 47375-add-stringbytesroundtrip-linter.md for PR #47375).

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

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot please run the pr-finisher skill and address the blocking feedback before rerunning checks.

Priority items:

  • Fix alphabetical ordering in pkg/linters/registry.go imports and All() so make fmt stays clean.
  • Make the string([]byte(...)) path use the underlying type consistently, matching the symmetric byte-slice check.
  • Add named-type coverage tests for the string/byte round-trip analyzer.
  • Review the suppressed PR-reviewer concerns about distinguishing real type conversions from arbitrary helper calls, and about []byte(string(b)) semantics vs bytes.Clone.

Failed checks to fix:

Please also complete and link the ADR noted by the Design Decision Gate comment in the PR body.

Generated by 👨‍🍳 PR Sous Chef · gpt54 6.7 AIC · ⌖ 7.85 AIC · ⊞ 5.5K ·
Comment /souschef to run again

Copilot AI and others added 2 commits July 22, 2026 19:02
Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>
- Add IsType() checks to both outer and inner CallExpr to correctly
  distinguish type conversions from arbitrary function calls
- Use underlying types consistently in both round-trip checks
- Add named-type and non-conversion test cases to the fixture
- Fix alphabetical ordering of stringbytesroundtrip.Analyzer in All()
- Add stringbytesroundtrip to spec_test.go documentedAnalyzers()
- Bump doc.go analyzer count from 56 to 57 and add bullet
- Add stringbytesroundtrip entries to README.md (overview, table, deps)

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

Copilot AI commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

@copilot please run the pr-finisher skill and address the blocking feedback before rerunning checks.

Priority items:...

All items addressed in commit fix(linters): address review feedback for stringbytesroundtrip linter:

  • IsType() checks: Both the outer and inner CallExpr now use pass.TypesInfo.Types[expr.Fun].IsType() to confirm they are type conversions, not arbitrary function calls (matching the pattern in bytescomparestring).
  • Consistent underlying-type checks: The string([]byte(...)) path now uses innerUnderlying (.Underlying()) for the inner conversion type, matching the symmetric []byte(string(...)) check.
  • Named-type test cases: Added myString/myBytes named types to the fixture, covering both named-type round-trips (flagged) and non-conversion function calls (not flagged).
  • Registry ordering: stringbytesroundtrip.Analyzer moved to alphabetically correct position in All() (after strconvparseignorederror); make fmt fixed the import ordering too.
  • Doc surfaces: spec_test.go documentedAnalyzers(), doc.go (count 56→57, bullet added), and README.md (overview, Subpackages table, Dependencies) all updated.

make fmt, make lint, and make test-unit all pass locally. CI re-trigger needed for final green checks.

@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 · gpt54 7.24 AIC · ⌖ 6.95 AIC · ⊞ 7K ·
Comment /souschef to run again

Copilot AI commented Jul 22, 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 unresolved review threads addressed and replied to. Local validation summary:

  • make fmt — ✅ clean
  • make lint — ✅ clean
  • make test-unit-all — ✅ all tests pass including TestRegistryMatchesDocumentation and TestDocSurfacesMatchRegistryAndSpecList

All 7 review threads (2 from copilot-pull-request-reviewer, 5 from github-actions[bot]) have been replied to. The fixes were committed in 413f555 covering: IsType() guards on both conversion expressions, consistent .Underlying() usage in both round-trip checks, correct alphabetical import ordering, named-type test coverage, and all required doc surfaces.

CI needs a human re-trigger (close/reopen or workflow_dispatch) to produce a fresh green run on the current HEAD.

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

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

Generated by 👨‍🍳 PR Sous Chef · gpt54 12.1 AIC · ⌖ 6.17 AIC · ⊞ 7K ·
Comment /souschef to run again

Copilot AI commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

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

...

All review comments addressed and local validation green:

  • ✅ Reviews — All 7 review threads have been replied to with the fixes from commit 413f555. Threads from copilot-pull-request-reviewer and github-actions[bot] are all addressed: IsType() guards on both expressions, consistent .Underlying() in both round-trip checks, alphabetical import ordering in registry.go, named-type test coverage, and doc surfaces (spec_test.go, doc.go, README.md).
  • ✅ Checks (local) — make fmt, make lint, and make test-unit-all all pass cleanly, including TestRegistryMatchesDocumentation and TestDocSurfacesMatchRegistryAndSpecList.
  • ❓ Checks (CI) — Stale after agent push; needs human re-trigger. The prior failures (test, impacted-go-tests, lint-go on run 29946642539) were on the pre-fix commit 8cf801fc. Current HEAD e7f4145 has the fixes; CGO/CWI runs on the current HEAD require human approval before test jobs execute.
  • ✅ Mergeable — PR is open, not draft, branch is up to date with main (merged in e7f4145).

Hand-off: CI must be re-triggered by a maintainer (close/reopen PR, workflow_dispatch, or a push) before merge.

@pelikhan
pelikhan merged commit 97b3e94 into main Jul 22, 2026
19 checks passed
@pelikhan
pelikhan deleted the linter-miner/stringbytesroundtrip-c93b0c9cf4ee201b branch July 22, 2026 20:25
@github-actions

Copy link
Copy Markdown
Contributor Author

🎉 This pull request is included in a new release.

Release: v0.83.1

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