New rectors and small improvements#8
Conversation
Rewrites statement-level calls to the deprecated global hide() and show() functions to direct $element['#printed'] = TRUE/FALSE assignment. The functions are deprecated in drupal:11.4.0 and removed in drupal:13.0.0. Expression-context uses (where the return value is captured) are skipped because the original returns the element while the rewrite would not. Live-tested against fpa, saml_sp, vertical_tabs_config, and field_group_background_image — 4 modules, 10 calls transformed cleanly. See https://www.drupal.org/node/2258355 See https://www.drupal.org/node/3261271 (change record)
Migrates removed Drupal/PHPUnit test framework methods to their PHPUnit 11+ replacements: - $this->expectDeprecation() (PHPUnit no-arg form) → removed - $this->expectDeprecation($msg) (Drupal trait form) → expectUserDeprecationMessage($msg) - $this->expectDeprecationMessage($msg) → expectUserDeprecationMessage($msg) - $this->expectDeprecationMessageMatches($p) → expectUserDeprecationMessageMatches($p) Renames are BC-wrapped via DeprecationHelper::backwardsCompatibleCall() so tests keep passing on both pre-11.4 (old methods) and 11.4+ (new methods). The 0-arg PHPUnit form is unconditionally removed because real-world contrib uses the 1-arg Drupal-trait form. Live-tested against honeypot, key, entity_usage, and node_revision_delete. ExpectDeprecationTrait is deprecated in drupal:11.4.0 and removed in drupal:12.0.0. See https://www.drupal.org/node/3550268 See https://www.drupal.org/node/3545276 (change record)
…e #3571874 Four BC class aliases in Drupal\block_content\Access were deprecated in drupal:11.3.0 and removed in drupal:12.0.0. Add config-only RenameClassRector entries mapping each to its canonical Drupal\Core\Access home: - AccessGroupAnd - DependentAccessInterface - RefinableDependentAccessInterface - RefinableDependentAccessTrait See https://www.drupal.org/node/3571874 and https://www.drupal.org/node/3527501 (change record).
Introduce a rector → PHPStan-deprecation-message map so a future upgrade_status PR can replace its hardcoded $rector_covered array with a generated, version-aware registry. Source of truth lives on the code, not in a sidecar file: - Custom rector classes: public const PHPSTAN_MESSAGES = [...]. - Config-only registrations: // PHPSTAN_MESSAGES <Rector>: comment block above the ruleWithConfiguration() call. Tooling: - scripts/normalize-phpstan-message.php applies the three transforms upgrade_status's DeprecationAnalyzer::categorizeMessage() applies before isRectorCovered() (whitespace collapse, ": in" → ". Deprecated in", strip leading \\Drupal). Same transforms run on stored messages so the registry is comparison-ready. - scripts/generate-coverage-registry.php walks src/ + config/, reads both shapes, normalizes, writes config/coverage-registry.php (rector short name → list of normalized messages). Worked example added to ReplaceExpectDeprecationRector (captured via synthetic probe against installed 11.4-dev). 3571874 config-only block gets a TODO marker rather than a synthesized guess, since the aliases are already gone from 11.4-dev core and a live capture requires a 11.3.x test env. rector-live-test SKILL.md gets a new step 5 wiring the capture into the existing live-test flow: while the contrib module is still installed and the pre-transform file on disk, run PHPStan, normalize the message, store on the class or in the config comment block, then regenerate the registry.
…#3520946
Replaces $block->setConfigurationValue('items_per_page', 'none') with NULL
for Views block plugins. The string 'none' was deprecated in drupal:11.2.0
and removed in drupal:12.0.0; NULL is the canonical value for inheriting
the items-per-page setting from the view.
See https://www.drupal.org/node/3520946
See https://www.drupal.org/node/3522240 (change record)
Replaces deprecated DrupalTestCaseTrait::getDrupalRoot() instance calls with direct $this->root property access. The method was deprecated in drupal:11.4.0 and removed in drupal:13.0.0. The rule targets subclasses of BrowserTestBase, KernelTestBase, and UnitTestCase, which all inherit the $root property via DrupalTestCaseTrait. Static calls and BuildTestBase (which overrides the method with a non-deprecated implementation) are intentionally left untouched. See https://www.drupal.org/node/3589047 See https://www.drupal.org/node/3574112 (change record)
…ctor Captures the three real PHPStan deprecation messages this rector covers — one per base test class (BrowserTestBase, KernelTestBase, UnitTestCase). The BrowserTestBase variant was verified against automatic_updates 4.1.x; the KernelTestBase variant against project_browser 2.1.x. The UnitTestCase variant mirrors the deterministic PHPStan format. Regenerates config/coverage-registry.php for upgrade_status consumption.
…538660 Replaces DRUPAL_DISABLED/OPTIONAL/REQUIRED with CommentPreviewMode enum cases in CommentTestBase::setCommentPreview() calls. Passing an int to this method was deprecated in drupal:11.3.0 and is removed in drupal:13.0.0; the new CommentPreviewMode enum only exists on Drupal >= 11.3.0, so the replacement is BC-wrapped via AbstractDrupalCoreRector + DeprecationHelper. The type guard targets Drupal\Tests\comment\Functional\CommentTestBase (the actual owner of setCommentPreview, not the NodeTypeInterface the upstream digest incorrectly pointed at). A minimal CommentTestBase stub is added so PHPStan can resolve the receiver type during rector tests. A TODO PHPSTAN_MESSAGES comment is included because PHPStan emits no deprecation for this call: setCommentPreview() itself is not @deprecated (the trigger_error fires at runtime when an int is passed), and phpstan does not flag file-scope const usage for DRUPAL_DISABLED/OPTIONAL/REQUIRED. See https://www.drupal.org/node/3538660 See https://www.drupal.org/node/3538678 (change record)
Rewrites deprecated UiHelperTrait::drupalGet() $headers patterns: - ['Header-Name: value'] → ['Header-Name' => 'value'] - ['Header-Name' => NULL] → ['Header-Name' => ''] Deprecated in drupal:11.1.0, removed in drupal:12.0.0. The associative format has always been the documented contract; no new Drupal API is required, so no BC wrapping is needed. Type guard: Drupal\Tests\BrowserTestBase (UiHelperTrait fires the deprecation; KernelTestBase uses HttpKernelUiHelperTrait, which does not). Validated against pager_serializer 8.x-1.x (Functional/Views/StyleSerializerTest.php).
…sue #3448457 Rewrites EntityFormMode::create([..., 'description' => '', ...]) to use NULL instead of an empty string. Setting the description property of an EntityFormMode to '' was deprecated in drupal:11.2.0 and must be NULL in drupal:12.0.0. Matches both the short class name (use-imported) and the fully-qualified \Drupal\Core\Entity\Entity\EntityFormMode::create() form via an isName() static-call guard. Sibling classes (EntityViewMode), non-empty descriptions, already-migrated NULL values, and other array keys are all left untouched. The replacement is plain PHP, so no BC wrapping is needed. The deprecated pattern is genuinely rare in contrib (16 modules call EntityFormMode::create() but none with 'description' => ''); validated via synthetic probe.
…r issue #3529274 Rewrites \Drupal::classResolver(\Drupal\views\ViewsConfigUpdater::class) to \Drupal::service(\Drupal\views\ViewsConfigUpdater::class). In drupal:11.3.0 ViewsConfigUpdater was registered as a service; classResolver() returns a fresh instance on each call, so state set via setDeprecationsEnabled(FALSE) was lost across hook invocations. The new call only resolves on Drupal >= 11.3.0 (the service isn't registered on older versions), so the replacement is BC-wrapped via DeprecationHelper::backwardsCompatibleCall(). Three layered isName guards ensure only the targeted call shape is touched: receiver must be \Drupal, method must be classResolver, and the single argument must be \Drupal\views\ViewsConfigUpdater::class. The argument guard correctly disambiguates against module subclasses sharing the short name (validated against entity_hierarchy, which uses \Drupal\entity_hierarchy\Update\ViewsConfigUpdater and is correctly skipped). Live-tested against tripal.
…e #3571593
Rewrites chained \Drupal::config('locale.settings')->get('translation.path')
(and configFactory()/this->config() variants) to \Drupal\Core\Site\Settings::get(
'locale_translation_path', 'public://translations'). The config key was
deprecated in drupal:11.4.0 and is removed in drupal:13.0.0; the customised
translation path must be set as $settings['locale_translation_path'] in
settings.php. BC-wrapped via DeprecationHelper so the rewritten code still
runs on pre-11.4 Drupal — though users must migrate the value to settings.php
before running the rule, otherwise the new branch silently falls back to the
default.
Matches purely structurally: two literal keys ('locale.settings' and
'translation.path') must appear in the expected positions, mirroring
ReplaceSystemPerformanceGzipKeyRector. Standalone $config->get('translation.path'),
unrelated config names, and unrelated keys are left untouched.
PHPStan / upgrade_status cannot detect this deprecation — the deprecated symbol
is the config key, not a PHP API with @deprecated or trigger_error(). A TODO
PHPSTAN_MESSAGES comment in the source documents the gap.
…e #3496369 Removes calls to AliasManager::setCacheKey() and AliasManager::writeCache(). Both methods were deprecated in drupal:11.3.0 and are removed in drupal:13.0.0 with no replacement — they became no-ops when the path alias preload cache was replaced by a Fiber-based bulk-lookup strategy. The receiver must be typed as \Drupal\path_alias\AliasManager or AliasManagerInterface; this guard prevents accidentally removing the unrelated ModuleHandler::writeCache() call. Removes the entire expression statement, leaving surrounding code intact. No BC wrapping needed since dropping a no-op call is safe on every Drupal version that still exposes the methods. Includes PHPSTAN_MESSAGES for both setCacheKey() and writeCache() captured from real contrib (drupal/redirect) and a synthetic probe respectively, plus the regenerated coverage-registry.
…3582118
Removes use Drupal\Tests\PhpUnitCompatibilityTrait; from test class
declarations. The trait was a forward-compatibility shim for PHPUnit API
differences across versions; it is deleted from Drupal core in Drupal 12
via #3582118, at which point any test class still composing the trait
fatal-errors at autoload time because the trait class no longer exists.
Gated to Drupal 12 only — and deliberately off by default. The trait
still exists on Drupal 10 (and may still hold shim methods that tests
depend on) and is an empty no-op on Drupal 11. Because the trait
composition is a structural Class_ change, not an Expr → Expr rewrite,
it cannot be BC-wrapped with DeprecationHelper. Running the rule
prematurely on a D10-only codebase risks silently stripping a
composition that the tests still rely on. The rector therefore only
fires when DrupalRectorSettings::setDrupalVersion('12.0.0') or higher
is set; the stub default (11.99.x-dev) keeps it inert for normal
D11-focused runs.
Extends AbstractDrupalCoreRector for the version-gate machinery but
overrides supportBackwardsCompatibility() to return false explicitly,
since structural class composition has no DeprecationHelper-style BC
wrapper to emit.
…ule restoration steps
…or for issue #3525388
…ctor Captures the three real PHPStan deprecation messages this rector covers — one per base test class (BrowserTestBase, KernelTestBase, UnitTestCase). The BrowserTestBase variant was verified against automatic_updates 4.1.x; the KernelTestBase variant against project_browser 2.1.x. The UnitTestCase variant mirrors the deterministic PHPStan format. Regenerates config/coverage-registry.php for upgrade_status consumption.
…538660 Replaces DRUPAL_DISABLED/OPTIONAL/REQUIRED with CommentPreviewMode enum cases in CommentTestBase::setCommentPreview() calls. Passing an int to this method was deprecated in drupal:11.3.0 and is removed in drupal:13.0.0; the new CommentPreviewMode enum only exists on Drupal >= 11.3.0, so the replacement is BC-wrapped via AbstractDrupalCoreRector + DeprecationHelper. The type guard targets Drupal\Tests\comment\Functional\CommentTestBase (the actual owner of setCommentPreview, not the NodeTypeInterface the upstream digest incorrectly pointed at). A minimal CommentTestBase stub is added so PHPStan can resolve the receiver type during rector tests. A TODO PHPSTAN_MESSAGES comment is included because PHPStan emits no deprecation for this call: setCommentPreview() itself is not @deprecated (the trigger_error fires at runtime when an int is passed), and phpstan does not flag file-scope const usage for DRUPAL_DISABLED/OPTIONAL/REQUIRED. See https://www.drupal.org/node/3538660 See https://www.drupal.org/node/3538678 (change record)
Rewrites deprecated UiHelperTrait::drupalGet() $headers patterns: - ['Header-Name: value'] → ['Header-Name' => 'value'] - ['Header-Name' => NULL] → ['Header-Name' => ''] Deprecated in drupal:11.1.0, removed in drupal:12.0.0. The associative format has always been the documented contract; no new Drupal API is required, so no BC wrapping is needed. Type guard: Drupal\Tests\BrowserTestBase (UiHelperTrait fires the deprecation; KernelTestBase uses HttpKernelUiHelperTrait, which does not). Validated against pager_serializer 8.x-1.x (Functional/Views/StyleSerializerTest.php).
…sue #3448457 Rewrites EntityFormMode::create([..., 'description' => '', ...]) to use NULL instead of an empty string. Setting the description property of an EntityFormMode to '' was deprecated in drupal:11.2.0 and must be NULL in drupal:12.0.0. Matches both the short class name (use-imported) and the fully-qualified \Drupal\Core\Entity\Entity\EntityFormMode::create() form via an isName() static-call guard. Sibling classes (EntityViewMode), non-empty descriptions, already-migrated NULL values, and other array keys are all left untouched. The replacement is plain PHP, so no BC wrapping is needed. The deprecated pattern is genuinely rare in contrib (16 modules call EntityFormMode::create() but none with 'description' => ''); validated via synthetic probe.
…r issue #3529274 Rewrites \Drupal::classResolver(\Drupal\views\ViewsConfigUpdater::class) to \Drupal::service(\Drupal\views\ViewsConfigUpdater::class). In drupal:11.3.0 ViewsConfigUpdater was registered as a service; classResolver() returns a fresh instance on each call, so state set via setDeprecationsEnabled(FALSE) was lost across hook invocations. The new call only resolves on Drupal >= 11.3.0 (the service isn't registered on older versions), so the replacement is BC-wrapped via DeprecationHelper::backwardsCompatibleCall(). Three layered isName guards ensure only the targeted call shape is touched: receiver must be \Drupal, method must be classResolver, and the single argument must be \Drupal\views\ViewsConfigUpdater::class. The argument guard correctly disambiguates against module subclasses sharing the short name (validated against entity_hierarchy, which uses \Drupal\entity_hierarchy\Update\ViewsConfigUpdater and is correctly skipped). Live-tested against tripal.
# Conflicts: # CHANGELOG.md # config/coverage-registry.php # config/drupal-11/drupal-11.3-deprecations.php # config/drupal-11/drupal-11.4-deprecations.php
…ure/new-rectors-combined # Conflicts: # config/coverage-registry.php
…ure/new-rectors-combined # Conflicts: # config/coverage-registry.php
Self-review notes (Claude)Scope: 18 new D11 rectors, BC-wrap refactor of two existing rectors, opt-in Blockers / High
Medium
Low / nits
What looks good
Recommend before merge
The rest can ship and be tightened in follow-ups. |
ClassConstantToClassConstantConfiguration and MethodToMethodWithCheckConfiguration gained a required $introducedVersion constructor argument in the BC-wrapping refactor. Make it optional with default '0.0.0' so downstream consumers that instantiate these value objects directly keep working. The default falls outside the BC-wrap gate (< 10.0.0), so pre-refactor no-wrap behaviour is preserved when the argument is omitted.
… strings Require the input string to use the conventional `Name: value` form (colon-space) and the name part to match a conservative ASCII pattern (`[A-Za-z][A-Za-z0-9-]*`) before splitting. Without these guards, strings like 'http://example.com' were silently rewritten to 'http' => '//example.com'. Adds a no-change fixture covering URL-shaped strings, paths with queries, empty/space/digit/underscore name parts, and the no-space-after-colon form.
…fixture Adds a regression fixture covering a class defined inside the trait's own namespace (`Drupal\Component\Utility`) using the short-name `use ToStringTrait;` with no explicit import. Confirms that `isName($traitName, FQCN)` resolves via PhpParser's NameResolver and rewrites the class correctly. No production code change.
…ions array Previously the rector unset `dialogClass` and reindexed the items array before checking whether the merge path could complete (e.g. existing `classes` resolves to a literal Array_, or both sides of a ui-dialog concatenation are String_ literals). When a later check failed, the rector returned null with `dialogClass` already deleted — a silent partial rewrite that lost the option entirely. Refactor splits refactor() into three phases: locate items (capturing node references, not indexes), validate the chosen merge branch, then mutate. Also bails on pathological duplicate `dialogClass` keys instead of silently rewriting one and leaving the other. Adds three no-change fixtures: non-literal new value, non-Array_ `classes`, and duplicate `dialogClass` entries.
…d on direct parent Previously the rector matched any class with a 5+ param constructor whose 4th argument was typed ImageToolkitInterface — regardless of the class hierarchy. A class with that coincidental shape but extending some other base would have its constructor silently mutated. Tightens the guard to require the class to directly extend ImageToolkitOperationBase. Adds a no-change fixture for a lookalike class with the matching shape but a different parent.
… closures in $toolkit count The 'exactly once' usage count for $toolkit descended into nested closures and arrow-functions, where a `$toolkit` parameter shadow or `use ($toolkit)` capture would have inflated the count and caused the rector to refuse to rewrite an otherwise-valid constructor. Contrib search (api.tresbien.tech) found zero ImageToolkitOperationBase subclasses with this pattern, so the impact is purely defensive — but the tightening is cheap and locks in the intended outer-scope-only semantic. No fixture added (no realistic trigger).
The bullet under [Unreleased] / ### Changed previously claimed the BC wrap "addresses the underlying concern" of the dropped maybe-path TODO comment in all cases. That's only true for configurations with introducedVersion >= 10.0.0 — pre-10.0 entries (urlInfo, getLowercaseLabel, clearCsrfTokenSeed) fall outside the BC-wrap gate and rewrite a maybe-typed receiver unconditionally. Contrib audit (api.tresbien.tech) found zero live callers of those three methods on receivers PHPStan cannot resolve, so the residual risk is theoretical. Updates the CHANGELOG bullet to acknowledge this explicitly rather than overclaim safety.
Self-review follow-up — all 7 blocker/high items addressedResolution of the items raised in the self-review comment above. Full test suite green (486 / 486).
HighlightsItem 1 — Item 3 — Value-object ctor BC: Item 6 — Items 4 + 5 — Closed as no-op (contrib search showed no realistic trigger)Item 2 — pre-10.0 maybe-path silent rewrite: contrib search (api.tresbien.tech) for the three pre-10.0 configured methods returned ~2 live callers for Item 5 — closure-scope $toolkit miscount: contrib search for Item 7 — same-namespace short-name resolution: added a fixture for a class in Medium-tier follow-ups not addressed in this batchSeveral MED items from the original review remain — |
Existing consumers of Drupal11SetList::DRUPAL_111 / DRUPAL_112 / DRUPAL_113 who relied on the listed RenameClassRector entries firing automatically will silently stop getting those rewrites on upgrade — the entries moved to the new opt-in *_BREAKING sets. Adds a Changed bullet under [Unreleased] listing each affected minor and the matching set consumers must opt into.
MED-tier review items — dispositionFollow-up on the MED items called out in the self-review comment. Each was verified against real Drupal contrib via the
Why the no-ops
Version-discrimination fixture gap: the What was fixed
NetAll 7 blocker/high items and 6 MED items addressed. 1 production-code fix ( The contrib-data-driven approach also surfaced a useful pattern for future PR reviews: many "could this break?" concerns about rector matching can be answered cheaply by querying api.tresbien.tech for the pattern across all Drupal contrib, before designing a fix. |
Description
Adds 18 new Drupal 11 deprecation rectors and reorganises how non-BC class renames
ship. Highlights:
New BC-wrappable rectors (default
DRUPAL_11Xsets)RemoveDrupalToStringTraitRector— stripsToStringTraitand inlines__toString()(D11.4 → D13)TaxonomyTermPageVariableToViewModeRector—$variables['page']→$variables['view_mode'] === 'full'(D11.3 → D13)ReplaceNonBoolAccessRector— integer-literal#accessvalues →true/false(D11.4 → D13)ReplaceDialogClassOptionRector—dialogClass→classes['ui-dialog']on Ajax dialog commands (D11.3 → D12)RemoveToolkitArgFromImageToolkitOperationConstructorRector— drops the deprecated 4thImageToolkitInterfacector arg (D11.4 → D13)RemoveRendererAddCacheableDependencyNonObjectRector— deletesaddCacheableDependency()calls passing statically-provable non-objects (D11.3 → D13)RemoveInstallSchemaSystemSequencesRector— stripsinstallSchema('system', 'sequences')test setup (D10.2 → D12)RemovePhpUnitCompatibilityTraitRector— strips the trait composition; gated to Drupal-version ≥ 12.0.0 because the trait still exists on D10/D11 (D12 deletion)GroupLegacyToIgnoreDeprecationsRector—@group legacy→ PHPUnit 10#[IgnoreDeprecations]attributeRemoveAliasManagerCacheMethodCallsRector— deletesAliasManager::setCacheKey()/writeCache()no-op calls (D11.3 → D13)ReplaceLocaleTranslationPathConfigRector—locale.settings:translation.pathconfig read →Settings::get('locale_translation_path', …); BC-wrapped (D11.4 → D13)ViewsConfigUpdaterClassResolverToServiceRector—\Drupal::classResolver(ViewsConfigUpdater::class)→\Drupal::service(...); BC-wrapped (D11.3 → D13)EntityFormModeEmptyDescriptionToNullRector—'description' => ''→NULLonEntityFormMode::create()(D11.2 → D12)DrupalGetHeadersAssocArrayRector— converts the two deprecated$headersshapes ondrupalGet()to associative (D11.1 → D12)ReplaceHideShowWithPrintedRector— statement-levelhide()/show()→$element['#printed'] = TRUE/FALSE(D11.4 → D13)ReplaceExpectDeprecationRector—expectDeprecation*test methods → PHPUnit 11expectUserDeprecation*; BC-wrapped (D11.4 → D12)GetDrupalRootToRootPropertyRector—DrupalKernelInterface::getDrupalRoot()→->rootpropertyViewsBlockItemsPerPageNoneToNullRector— Views blockitems_per_page: 'none'→nullPlus three new
RenameClassRectorentries (BC-safe across all supported minors):block_content\Access\*→Core\Access\*,LibraryDiscovery→LibraryDiscoveryInterface,EntityPermissionsRouteProviderWithCheck→EntityPermissionsRouteProvider.New opt-in "breaking" sets
Four new per-minor sets —
DRUPAL_111_BREAKING,DRUPAL_112_BREAKING,DRUPAL_113_BREAKING,DRUPAL_114_BREAKING— holdRenameClassRectorentrieswhose replacement symbol was introduced together with the deprecation and
does not exist on older minors. None of these is included in
DRUPAL_11X/DRUPAL_11; consumers must load each one explicitly after committing to dropthe minor named in that file's docblock. Targets verified missing on Drupal
10.6.x:
AliasWhitelist→AliasPrefixList(11.1); pgsqlEntityQuery,migrate-source moves,
I18nQueryTraitmove (11.2);WorkspaceAssociation→WorkspaceTracker,block_content\Accessmoves (11.3);menu_link_contentmigrate-process classes (11.4).
The
jsonapi\ResourceResponseValidatorrename (#3472008) was deliberatelynot shipped — the replacement lives in a core test module, so rewriting
production FQCNs to it would fatal on any site that does not enable that
module.
Refactor: auto-BC for two existing rectors
ClassConstantToClassConstantRectorandMethodToMethodWithCheckRectornowextend
AbstractDrupalCoreRectorand auto-wrap theirExpr → Exprrewritesvia
DeprecationHelper::backwardsCompatibleCall(). Their configuration valueobjects gain a required
introducedVersionargument and implementVersionedConfigurationInterface. Closes three D11 → D10 regressions(
Comment*enums in 11.4,RequirementSeverityin 11.2,AliasManagermethod rename in 11.1) without moving anything to a
-breaking.phpset.The
MethodToMethodWithCheckRectorTODO-comment fallback for themaybeinference case is dropped — the BC wrap makes both branches runtime-safe.
Infrastructure
config/coverage-registry.php,scripts/generate-coverage-registry.php,scripts/normalize-phpstan-message.php):links each rector to the verbatim PHPStan deprecation messages it covers,
so coverage gaps can be audited mechanically.
To Test
vendor/bin/phpunit tests/src/Drupal11/Rector/Deprecation— fixture coverage for every new rector (basic + no-change + edge cases;
fixture-below-version/for the two BC-wrapped + version-gated rectors).vendor/bin/phpstan analyse.ReplaceHideShowWithPrintedRector(fpa,saml_sp, vertical_tabs_config, field_group_background_image),
DrupalGetHeadersAssocArrayRector(pager_serializer), and others notedper-rector in CHANGELOG.
Drupal.org issues
Per-rector issue links are in the CHANGELOG entries.