Test against Go stable/oldstable, upgrade staticcheck to 2026.2.2, let Renovate keep it current (#234)

* Test against Go stable and oldstable

The CI matrix pinned explicit Go versions that had to be bumped by hand
and regularly fell behind the Go release policy. setup-go's `stable`
and `oldstable` aliases always resolve to the current and previous Go
release (today 1.27.x and 1.26.x), so CI keeps testing both supported
versions without manual or Renovate-driven bumps. Patch releases are
picked up automatically too.

go.mod is left untouched on purpose: it states the minimum version we
require from users, not the versions CI tests against.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Upgrade staticcheck to 2026.2.2

2026.2 is the first staticcheck release that supports Go 1.27; older
releases abort on a Go 1.27 toolchain. 2026.2.2 is the latest patch
release.

The Makefile now installs exactly the version CI runs, via a single
STATICCHECK_VERSION variable. Before, `make staticcheck` ran an unpinned
`go get -u` (which no longer installs binaries), `@latest`, or a stale
pin, so local results could differ from CI.

Both pins carry a `# renovate:` annotation so Renovate can bump them
together.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Let Renovate keep the Makefile's staticcheck in sync with CI

The staticcheck release in testing.yml was already managed by a regex
custom manager, but the Makefile pin added in the previous commit was
not, so the two could drift apart again.

A second regex custom manager reads the annotated STATICCHECK_VERSION in
the Makefile. It uses the same depName (dominikh/go-tools) and the same
`regex:` versioning as the workflow rule, so Renovate treats both pins
as one dependency and bumps CI and the Makefile in the same pull
request.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml
index 7a5b87c..b5c59b4 100644
--- a/.github/workflows/testing.yml
+++ b/.github/workflows/testing.yml
@@ -15,7 +15,7 @@
     runs-on: ubuntu-26.04
     strategy:
       matrix:
-        go: ["1.27", "1.26"]
+        go: [stable, oldstable]
 
     steps:
       - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
@@ -32,7 +32,7 @@
     runs-on: ubuntu-26.04
     strategy:
       matrix:
-        go: ["1.27", "1.26"]
+        go: [stable, oldstable]
 
     steps:
       - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
@@ -48,7 +48,7 @@
     runs-on: ubuntu-26.04
     strategy:
       matrix:
-        go: ["1.27", "1.26"]
+        go: [stable, oldstable]
 
     steps:
       - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
@@ -60,7 +60,7 @@
         uses: dominikh/staticcheck-action@9716614d4101e79b4340dd97b10e54d68234e431 # v1.4.1
         with:
           # renovate: datasource=github-releases depName=dominikh/go-tools
-          version: "2026.2.1"
+          version: "2026.2.2"
           install-go: false
           cache-key: ${{ matrix.go }}
 
@@ -69,7 +69,7 @@
     runs-on: ubuntu-26.04
     strategy:
       matrix:
-        go: ["1.27", "1.26"]
+        go: [stable, oldstable]
 
     steps:
       - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
@@ -87,7 +87,7 @@
     runs-on: ubuntu-26.04
     strategy:
       matrix:
-        go: ["1.27", "1.26"]
+        go: [stable, oldstable]
 
     steps:
       - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
diff --git a/Makefile b/Makefile
index e77bc13..a37d344 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,8 @@
 .DEFAULT_GOAL := help
 
+# renovate: datasource=github-releases depName=dominikh/go-tools
+STATICCHECK_VERSION := 2026.2.2
+
 .PHONY: help
 help: ## Outputs the help
 	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
@@ -14,5 +17,5 @@
 
 .PHONY: staticcheck
 staticcheck: ## Runs static code analyzer staticcheck
-	go get -u honnef.co/go/tools/cmd/staticcheck
+	go install honnef.co/go/tools/cmd/staticcheck@$(STATICCHECK_VERSION)
 	staticcheck ./...
\ No newline at end of file
diff --git a/renovate.json b/renovate.json
index 9b64002..4402ed4 100644
--- a/renovate.json
+++ b/renovate.json
@@ -22,6 +22,17 @@
         "# renovate: datasource=(?<datasource>[a-z-]+?) depName=(?<depName>[^\\s]+?)\\s+version: \"(?<currentValue>[^\"]+)\""
       ],
       "versioningTemplate": "regex:^(?<major>\\d+)\\.(?<minor>\\d+)(\\.(?<patch>\\d+))?$"
+    },
+    {
+      "customType": "regex",
+      "description": "Update the staticcheck release installed by the Makefile, so local runs always match CI",
+      "managerFilePatterns": [
+        "/^Makefile$/"
+      ],
+      "matchStrings": [
+        "# renovate: datasource=(?<datasource>[a-z-]+?) depName=(?<depName>[^\\s]+?)\\s+STATICCHECK_VERSION := (?<currentValue>\\S+)"
+      ],
+      "versioningTemplate": "regex:^(?<major>\\d+)\\.(?<minor>\\d+)(\\.(?<patch>\\d+))?$"
     }
   ],
   "packageRules": [