Skip to content

Routine maintenance 2026-07 - #88

Merged
johannesluedke merged 9 commits into
mainfrom
maintenance-2026-07-31
Aug 3, 2026
Merged

Routine maintenance 2026-07#88
johannesluedke merged 9 commits into
mainfrom
maintenance-2026-07-31

Conversation

@johannesluedke

@johannesluedke johannesluedke commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Summary

Routine maintenance pass — runtime versions, gems, Node tooling and CI.

  • Ruby 4.0.5 → 4.0.6, Node.js 24.16.0 → 26.5.1 (.tool-versions)
  • bundler 4.0.12 → 4.0.17
  • Gems: rubocop 1.87.0 → 1.88.2, rubocop-rspec 3.9.0 → 3.10.2, simplecov 0.22.0 → 1.0.3 (major), json 2.19.7 → 2.21.2, yard 0.9.44 → 0.9.45, plus parser/rubocop-ast/rbtree
  • Node tooling: prettier 3.8.3 → 3.9.6, pnpm pin 11.5.1 → 11.18.0
  • CI: actions/checkout v6 → v7 across all three workflows, actions/setup-node v6 → v7; build.yml node-version 24 → 26
  • Coverage floor: branch 62.8 → 75.0. simplecov 1.0 filters spec/ by default, dropping the basis from 2298 relevant lines to 653 and 137 branches to 116, which left the old floor 20 branches slack against an actual 80.17% — on the criterion primary_coverage marks as primary. line stays at 97.17 because that denominator is Ruby-version dependent (651 on the 3.3 leg vs 653 on 3.4/4.0).

Deliberately unchanged

  • required_ruby_version >= 3.3.0, the CI matrix ['3.3', '3.4', '4.0'], and TargetRubyVersion: 3.3. Per ruby-lang branches, 4.0 and 3.4 are in normal maintenance and 3.3 is in security maintenance (EOL expected 2027-03-31). TargetRubyVersion intentionally tracks the oldest supported line, not the Ruby the gem is developed on.
  • Runtime dependency constraints (bunny >= 3.0.0, connection_pool ~> 3.0, json >= 2.9.0). All three already resolve to the newest published versions (3.1.0 / 3.0.2 / 2.21.2), so there is nothing to widen — and narrowing a gem's constraints would propagate conflicts to every consuming app.
  • Other GitHub Actions. ruby/setup-ruby v1, pnpm/action-setup v6, codeql-action v4, dependency-review-action v5 and both fac/* v2 actions are already on their latest major. Note that for these, "newest release" is not a reliable signal — both setup-node and codeql-action publish backports to the previous major after the newer major's release, so the majors were resolved from the floating tag and the isLatest flag rather than from release ordering.
  • No version bump / changelog entry. This pass changes only dev tooling, nothing shipped in the gem. Verified rather than assumed: on main after Routine maintenance 2026-06 #87 — which merged while 0.26.0 was already published to rubygems — the Release Gem step concluded success, so fac/ruby-gem-push-action tolerates an already-published version and main will not redden.

One finding worth reviewer attention

RSpec/ExpectActual now fires on have_been_published. rubocop-rspec 3.10.0 closed a false negative for matchers that take no arguments, so the matcher's documented API (expect(routing_key: '…').to have_been_published, where the subject is a criteria hash, not a value under test) is now flagged 14 times in its own spec. The cop is excluded for that one spec in .rubocop.yml rather than the specs being rewritten.

The underlying signal is real: the matcher's API is inverted. Changing it would be a breaking change, so we're not doing that now.

🤖 Generated with Claude Code

Local toolchain only. `.rubocop.yml`'s TargetRubyVersion and the gemspec's
required_ruby_version deliberately stay at 3.3 — as a published gem, ears must
keep enforcing compatibility with the oldest Ruby line it still supports, not
the newest one it is developed on.
- rubocop 1.87.0 -> 1.88.2, rubocop-rspec 3.9.0 -> 3.10.2
- simplecov 0.22.0 -> 1.0.3 (major; drops the simplecov-html and
  simplecov_json_formatter dependencies)
- json 2.19.7 -> 2.21.2, yard 0.9.44 -> 0.9.45, parser, rubocop-ast, rbtree

rubocop-rspec 3.10.0 closed a false negative in RSpec/ExpectActual for matchers
that take no arguments, which newly flags all 14 uses of `have_been_published`
in its own spec. The matcher takes the search criteria as its subject rather
than a value under test, so the pattern is intended and the cop is excluded for
that spec instead of rewritten. Every consumer of the matcher hits this on the
same rubocop-rspec bump, so the README documents the exclusion.

simplecov 1.0 no longer counts spec files as relevant, so the coverage basis
drops from 2298 to 653 lines. Both `minimum_coverage` thresholds still hold
(97.54% line vs 97.17%, 80.17% branch vs 62.8%) and now measure lib/ only.
- prettier 3.8.3 -> 3.9.6 (no reformatting)
- pnpm 11.5.1 -> 11.18.0 via the packageManager pin, which pnpm self-manages
  locally and pnpm/action-setup reads in CI

pnpm-lock.yaml stays on lockfileVersion 9.0 and still satisfies
`pnpm install --frozen-lockfile`.
- actions/checkout v6 -> v7 across all three workflows
- build.yml node-version 24 -> 26, tracking the .tool-versions bump

setup-node v6, ruby/setup-ruby v1, pnpm/action-setup v6, codeql-action v4,
dependency-review-action v5 and both fac/* v2 actions are already on their
latest major.
The `RSpec/ExpectActual` exclusion is incidental to using the matcher and does
not warrant space in the public documentation. The exclusion for this repo's own
spec stays in `.rubocop.yml`.
@johannesluedke
johannesluedke marked this pull request as ready for review July 31, 2026 13:53
@johannesluedke
johannesluedke requested a review from brerx as a code owner July 31, 2026 13:53
@johannesluedke johannesluedke self-assigned this Jul 31, 2026
Corrects `Update CI` (01bedda), which claimed setup-node was already on its
latest major. v7.0.0 and v6.5.0 were published five minutes apart on
2026-07-14, so ordering releases by publish date reports the v6 backport as
newest; v7.0.0 is the one flagged `isLatest` and `refs/tags/v7` exists.

v7.0.0 is an ESM migration plus dependency upgrades, two new cache outputs and
the removal of a dummy NODE_AUTH_TOKEN export that only affected npm publishing.
Nothing touches `node-version` or `cache: pnpm`.
simplecov 1.0 loads the test_frameworks profile by default, which filters
`spec/`, so the coverage basis dropped from 2298 relevant lines to 653 and from
137 branches to 116. The old `branch: 62.8` was fitted to the inflated basis and
left 20 branches of slack against an actual 80.17% — on the criterion
`primary_coverage :branch` marks as primary, so coverage could regress 17
percentage points without CI noticing.

`line: 97.17` stays: the line denominator is Ruby-version dependent (651 on the
3.3 leg vs 653 on 3.4 and 4.0), so a tighter line floor is brittle across the
matrix. The branch denominator is 116 on every leg.
@johannesluedke
johannesluedke merged commit ea238b0 into main Aug 3, 2026
7 checks passed
@johannesluedke
johannesluedke deleted the maintenance-2026-07-31 branch August 3, 2026 06:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants