[sergo] Sergo Report: REGISTRY-REFACTOR-DETECT+newexplore-not_planned-reconcile-audit - 2026-08-24 #55268
Closed
Replies: 1 comment
|
This discussion was automatically closed because it expired on 2026-08-25T04:16:22.184Z.
|
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Executive summary
R61 opened with a breaking-change surprise: the historical registry-delta detector (
grep -c Analyzer cmd/linters/main.go) is dead.main.gois now a 14-linemultichecker.Main(linters.All()...)wrapper; the analyzer registry lives inpkg/linters/registry.go'sallAnalyzersslice, currently 67 entries (up from 43 at R60 — several batched merges happened between runs).doc.go+ a newdoc_sync_test.gonow auto-enforce registry/doc/README parity, permanently closing the old "doc-sync gap" finding vein.Strategy split: 50% cached-context reuse (loaded last 3 strategy entries, re-verified prior not_planned candidates against current source), 50% new exploration (registry-refactor detection, CI-enforcement-gap mapping, a meta-audit of the
not_plannedclosure reason).1 issue filed, 0 skipped as duplicates (zero open
sergoissues pre-run).Tool/registry updates
pkg/linters/registry.goallAnalyzerscount (67) going forward, notmain.gogrep..github/workflows/cgo.yml(LINTER_FLAGS,-test=false); 15 not enforced (see details).Not CI-enforced (15) — probe targets for future runs
errorfwrapv, errormessage, excessivefuncparams, generatedyamlheredoc, hardcodedfilepath, httprespbodyclose, httpstatuscode, largefunc, lenstringzero, manualpathconcat, packagelevelmutableslicemap, seenmapbool, sprintferrdot, ssljson, stringsconcatloop
Findings
.github/skills/ssl/ssl.json) requires unique IDs and full graph integrity;ValidateDoc(ssljson.go:98-158) never detects duplicate scene/step IDs (map silently overwrites) and never validatesstep.SceneIDagainst the scene set (field decoded, never read). See filed issue for full evidence.types.Named, no longer pure identifier matching) and manualmutexunlock (manualmutexunlock false negative: distinct struct instances sharing a mutex field collapse to one tracking key (Selections.Obj() [Content truncated due to length] #41376:mutexKey{base,field}composite key present) — bothnot_planned-closed issues describe bugs that genuinely no longer exist in current source.Meta-finding:
state_reason: not_plannedis not a reliable proxy for "handled"About a third of recent sergo-labeled issues close with
not_planned. This reason is used for two very different situations:gh-aw-expires:marker, "Issue Monster" auto-triage) without ever being fixed — confirmed via issue timelines for ssljson (29th linter) graph-integrity gap: logic-step scene_id is parsed but never validated — orphan steps pass silently #39493/ssljson precision: duplicate scene/step IDs are silently deduped by map[string]bool — the spec's "unique IDs" Pass-4 rule is uni [Content truncated due to length] #39494, which describe the exact ssljson gap re-filed today.Spot-checking in both directions this run: httpstatuscode/manualmutexunlock's
not_plannedclosures turned out to be legitimate (bug fixed elsewhere), while ssljson's turned out to be expiration-without-fix. Conclusion:not_plannedclosures need individual source re-verification, not a blanket trust in either direction — this refines the existingphantom_reconcilepattern, which only covered the opposite failure mode (landed-but-still-open).Generated tasks
ssljson.go: add duplicate-ID tracking to thesceneIDs/stepIDsbuild loops (report on first repeat) and a new Rule 8 validatingstep.SceneIDresolves viasetutil.Contains(sceneIDs, ...). Small, single-file + testdata change. Filed as issue (aw_sg61a1).Metrics
Historical context
R58-R60 exhausted the ctx-family FuncLit-boundary vein and the syntactic-stdlib-match vein (both fully migrated/fixed or filed). R60's writebytestring SuggestedFix-correctness finding (
aw_sg60a1) status is unconfirmed this run — worth a landed-check next time. R61's registry jump (43→67) suggests multiple linter-adding PRs merged in the ~7 weeks since R60; no per-linter changelog was available to attribute which merge added which analyzer.Recommendations / next-run focus
aw_sg60a1(writebytestring) landed.not_plannedindividual re-verification queue: nolint-suppression parity gap: 5 linters still have no (nolint/redacted) support, blocking CI enforcement #41844/nolint parity gap: 4 non-enforced context-family linters have no internal/nolint suppression (execcommandwithoutcontext, ctxback [Content truncated due to length] #41377 (nolint-suppression parity), panicinlibrarycode: init() and documented-contract exemptions cross FuncLit boundaries — false negatives for panics in nested cl [Content truncated due to length] #41606 (panicinlibrarycode FuncLit boundary), ctxbackground: enclosing-scope walk only inspects *ast.FuncDecl, skipping FuncLit boundaries — false negative for closures with [Content truncated due to length] #41164 (ctxbackground FuncLit boundary), wgdonenotdeferred precision: non-deferred wg.Done() inside a goroutine launched in a loop escapes detection (FuncLit scope bound [Content truncated due to length] #40947 (wgdonenotdeferred FuncLit-in-loop), rawloginlib precision: isRawLog matches the identifier name "log" syntactically — shadowing FP and alias-import FN in a CI-enfor [Content truncated due to length] #39981/regexpcompileinfunction precision: isRegexpCompileCall matches the identifier name "regexp" syntactically — alias import (re "re [Content truncated due to length] #39733 (alias-import gaps in rawloginlib/regexpcompileinfunction).All reactions