Issue #3619712: Give every test fixture builder a verb, the way core names methods
Core's method names begin with a verb; 377 of this module's did not, almost all of them test fixture builders named for what they return.
The fixtures are create*. slot() in 19 classes, resource() in 15, tariff() in 12, place() in 8, preset() in 6, channel() and booking() in 5 each, and the rest. Where the old name promised something the method does not return, the new one says what it does: createSlotWithTariff() hands back a slot and its tariff, createPlaceCandidate() builds a value object rather than an entity, createPresetTariff() builds the tariff that hangs on a preset rather than on a resource, and createTransactionId() returns an id.
The readers are get* or count*: getResolver(), getHeldPlaces(), getCoordinates(), getPlaceReads(), getStoredArtwork(), getOfferedAreas(), getPlusButton(), and countHeldByTheBooker(), countPlaces(), countSeatingQueries() where the thing returned is a number.
Production came to 24, not the 114 the detector reported. BookingAsk::forQuantity() and forQuantities() are fromQuantity() and fromQuantities(), which is the prefix the class already used for fromArrays(), across 81 call sites. SlotOffers::state() is getState(), SelectionPolicy::neutral() is createNeutral(), PolicyContext::checkpoint() is getCheckpoint(), FeePolicyResolver::description() is getDescription(), WeightedOrderFormBase::operations() is getOperations(), the two hold-policy form helpers are buildHoldPolicyFields() and getHoldPolicyValues(), and the private readers take get.
Everything else the detector flagged in production is a verb it did not know, exactly as the issue anticipated: preload, consolidate, describe, shareOut, settle, repair, renumber, mutate, suspend, sweep, take, refuse, relabel, resync, stamp, tidy. They are left alone. So are the sentence-named scenario bodies (theGridDrawsFromTheFeed(), aNoticeStaysLongEnoughToBeRead()), which are test method names reached through runScenario() and sentences by the same convention as test*.
What the detector had to learn to be trusted. Its first count was 961, against the issue's 866, because a first-word frequency rule taken from core cannot tell a rare verb from a noun. What it now excludes, and what each exclusion is worth: interface and abstract declarations, #[Hook] methods, {@inheritdoc} overrides, data providers, test*, route callbacks named in a routing.yml and in a PHP route provider (OrderOverviewController::detail is declared in OrderRouteProvider, not in yaml), procedural functions in .module/.install, script-local mg_*/ld_* helpers, and scenario bodies. After those, 579 remained and each distinct name was read by hand.
Two mistakes of mine, both caught by a gate rather than by review, and both worth knowing about before the next sweep. A repo-wide rename rewrote core's own AccessResult::neutral() and \Drupal::state() into methods that do not exist: phpstan reported it as 438 errors, and it is the reason a wide rename needs the foreign symbols protected by construction. And renaming the shared harness helper scenario() by editing only its declaring file broke 402 call sites at once, because a trait's callers live everywhere; the trait helpers were redone repo-wide.
Green locally: phpcs (the CI ruleset, exit 0), DrupalPractice, phpstan level 3 ([OK] No errors), and the whole kernel suite, 249 classes, all passing. No behaviour changes: every rename is a method name and its call sites, no stored value moves, and no string a reader sees changed.