You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Registry grew 43 → 67 analyzers since the last run — the biggest single-run jump on record — and the registration mechanism itself changed structurally: cmd/linters/main.go no longer lists analyzers inline; it now just calls linters.All(), whose canonical source is pkg/linters/registry.go. I updated the detection methodology in memory accordingly (the old grep -c Analyzer main.go trick is dead).
Strategy split 50/50: cached = re-verify the sg60a1 (writebytestring) compile-bug fix landed; new = audit the 24 newly-registered/previously-unaudited linters for recurrence of known bug classes. Both came back clean — zero new issues filed this run. That's a deliberate, evidence-backed outcome, not a shortfall: see rationale below.
Cached component — sg60a1 reverification
The writebytestring autofix-doesn't-compile bug (filed at R60) and its follow-ups are all landed and closed:
Audited every linter I hadn't seen referenced in the ~130 historical sergo issues: bytesbufferstring, mapdeletecheck, nilctxpassed, sprintfbool, stringsindexhasprefix, uncheckedflushreturn, walkfuncerrshadow, trimleftright, globwalkignorederror, ioutildeprecated, logfatallibrary, sprintferrorsnew, lenstringzero.
Checked each against every known bug pattern in memory: syntactic vs type-resolved package matching, FuncLit scope-boundary walks, nolint/test-skip wiring, comment-clobbering SuggestedFix spans, and the sg60a1-class exact-type-vs-Underlying() assignability bug. Result: all 13 use astutil.IsPkgSelector/type info correctly, wire nolint.HasDirectiveForLinter, and call filecheck.ShouldSkipFilename (which already combines test-file and generated-file skip — no separate gap to find). All 67 analyzers are present in .github/workflows/cgo.ymlLINTER_FLAGS for both native and wasm jobs, so nothing is sitting unenforced.
One specific worth noting: walkfuncerrshadow (flags err := filepath.Walk(..., func(..., err error) error {...}) shadowing) has zero production violations — a full-repo grep confirms every real call site already uses the walkErr naming convention specifically to avoid this. The linter is correct and already enforced; there's nothing to file.
Calibration refinement (recorded in memory for future runs): the sg60a1 bug class — t.Underlying() == types.String matching named string types when a fix requires an exact type — only bites when the SuggestedFix replacement feeds an exact-type function call parameter (e.g. io.WriteString(w, s)). It does not apply to comparison/binary-expression contexts: lenstringzero's fix rewrites len(s) == 0 → s == "", and s == "" compiles fine for named string types because the untyped "" constant adapts. Cross-referencing every linter that pairs SuggestedFix with an Underlying()-based type check turned up only writebytestring (fixed), bytescomparestring (comment-guard, already tracked), and lenstringzero (safe) — no new instance of the bug.
Reconciliation spot-check
Verified #57339 (sprintferrdot verb-set bug) against current code: still broken exactly as described — # flag still silently dropped at line 142, q/x/X verbs still excluded at line 75. Confirmed still open and accurate, not stale.
Why zero issues this run
Every real gap surfaced during this audit was already tracked by an existing open issue: #58376 (13-linter comment-guard gap, includes several of the linters I checked), #58150 (goroutinemissingrecover placement), #57606 (generatedyamlheredoc heredoc detection), #57340 (stringsconcatloop), #57339 (sprintferrdot, reconciled above). Filing near-duplicates against a registry this well-tracked would just be noise.
Tasks generated (recommendations, no new issues needed)
Registry-detection methodology fix — done this run: future runs must count pkg/linters/registry.go's allAnalyzers (or read doc.go's header) instead of grepping main.go.
Bug-class calibration — done this run: added the exact-type-vs-comparison-context distinction to memory so future SuggestedFix probes target the right shape.
Linters audited this run: 13 (new/previously-unaudited) + 1 reconciliation spot-check
New issues filed: 0 (all real gaps already tracked)
Cached bugs reverified landed: 4 (sg60a1 chain)
Success score: 6/10 — thorough, evidence-backed clean sweep; scored below a findings-producing run because no new actionable issue was produced, but the negative result is itself verified and the registry-detection fix + calibration refinement have lasting value for future runs.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Executive summary
Registry grew 43 → 67 analyzers since the last run — the biggest single-run jump on record — and the registration mechanism itself changed structurally:
cmd/linters/main.gono longer lists analyzers inline; it now just callslinters.All(), whose canonical source ispkg/linters/registry.go. I updated the detection methodology in memory accordingly (the oldgrep -c Analyzer main.gotrick is dead).Strategy split 50/50: cached = re-verify the sg60a1 (
writebytestring) compile-bug fix landed; new = audit the 24 newly-registered/previously-unaudited linters for recurrence of known bug classes. Both came back clean — zero new issues filed this run. That's a deliberate, evidence-backed outcome, not a shortfall: see rationale below.Cached component — sg60a1 reverification
The writebytestring autofix-doesn't-compile bug (filed at R60) and its follow-ups are all landed and closed:
io.WriteStringassignability)ioimportNew-exploration component — 13-linter clean sweep
Audited every linter I hadn't seen referenced in the ~130 historical sergo issues:
bytesbufferstring,mapdeletecheck,nilctxpassed,sprintfbool,stringsindexhasprefix,uncheckedflushreturn,walkfuncerrshadow,trimleftright,globwalkignorederror,ioutildeprecated,logfatallibrary,sprintferrorsnew,lenstringzero.Checked each against every known bug pattern in memory: syntactic vs type-resolved package matching, FuncLit scope-boundary walks, nolint/test-skip wiring, comment-clobbering
SuggestedFixspans, and the sg60a1-class exact-type-vs-Underlying()assignability bug. Result: all 13 useastutil.IsPkgSelector/type info correctly, wirenolint.HasDirectiveForLinter, and callfilecheck.ShouldSkipFilename(which already combines test-file and generated-file skip — no separate gap to find). All 67 analyzers are present in.github/workflows/cgo.ymlLINTER_FLAGSfor both native and wasm jobs, so nothing is sitting unenforced.One specific worth noting:
walkfuncerrshadow(flagserr := filepath.Walk(..., func(..., err error) error {...})shadowing) has zero production violations — a full-repo grep confirms every real call site already uses thewalkErrnaming convention specifically to avoid this. The linter is correct and already enforced; there's nothing to file.Calibration refinement (recorded in memory for future runs): the sg60a1 bug class —
t.Underlying() == types.Stringmatching named string types when a fix requires an exact type — only bites when theSuggestedFixreplacement feeds an exact-type function call parameter (e.g.io.WriteString(w, s)). It does not apply to comparison/binary-expression contexts:lenstringzero's fix rewriteslen(s) == 0→s == "", ands == ""compiles fine for named string types because the untyped""constant adapts. Cross-referencing every linter that pairsSuggestedFixwith anUnderlying()-based type check turned up onlywritebytestring(fixed),bytescomparestring(comment-guard, already tracked), andlenstringzero(safe) — no new instance of the bug.Reconciliation spot-check
Verified #57339 (
sprintferrdotverb-set bug) against current code: still broken exactly as described —#flag still silently dropped at line 142,q/x/Xverbs still excluded at line 75. Confirmed still open and accurate, not stale.Why zero issues this run
Every real gap surfaced during this audit was already tracked by an existing open issue: #58376 (13-linter comment-guard gap, includes several of the linters I checked), #58150 (
goroutinemissingrecoverplacement), #57606 (generatedyamlheredocheredoc detection), #57340 (stringsconcatloop), #57339 (sprintferrdot, reconciled above). Filing near-duplicates against a registry this well-tracked would just be noise.Tasks generated (recommendations, no new issues needed)
pkg/linters/registry.go'sallAnalyzers(or readdoc.go's header) instead of greppingmain.go.nilctxpassedoverlapwgdonenotdeferred's goroutine-launch patterns?), (b) re-check goroutinemissingrecover: recover-defer placed after risky code is accepted as safe, but never protects earlier statements #58150/stringsconcatloop: self-referential ASSIGN form misses map-index/selector accumulators #57340/generatedyamlheredoc: literal<<inside a quoted shell string is misreported as a heredoc #57606 for staleness the way sprintferrdot: verb-set check still wrong both directions after issue 40434 closed #57339 was checked here, (c) watchregistry.go's count for a 68th linter.Metrics
References:
Warning
Firewall blocked 1 domain
The following domain was blocked by the firewall during workflow execution:
api.anthropic.comTo allow these domains, add them to the
network.allowedlist in your workflow frontmatter:See Network Configuration for more information.
All reactions