Child of #3618694: Take every submodule out of the engine's words, in code and in prose. The engine has always had the concept: a subdivision a request may be confined to, that carries its own count, and that holds serialize on. It called it an area, which is a word about space, and it reads that way: an engine that books a hotel night or a projector has no areas, and a reader who learns the word reaches for it again.
That is not idle. The comment directly above one of the reach-ins fixed in #3618663: Take the engine out of another module's schema, in the two places it reached in talked about "a picker that had the hall open", and the reach-in followed the words.
Revenue management calls this a sub-inventory: a pool counted on its own. Accurate, and clumsy in an identifier. The project's own docs already supplied the short form: "What partitions the seats is the part of the house they sit in". So: partition.
What is renamed
The engine, and everywhere the concept crosses the seam: the provider interface and its method, the line and request key, the two flags a retry and an assignment set, the service tag, the placement module's implementation of the seam, and LockAnchors::SCOPE_SECTION, which is now SCOPE_PARTITION.
Two words, two layers, one translation point
partition is the engine's word for something it carries and never opens. area stays the placement module's word and the booker's: the picker's option groups, the JavaScript, the HTTP claim body, the admin form, and every area test class name. SlotClaimController::wanted() is the single point that reads the wire's area and emits the engine's partition. Everything downstream of it speaks partition, everything upstream speaks area.
Three more contracts publishing another module's shape
#3618663: Take the engine out of another module's schema, in the two places it reached in took the engine out of another module's schema in two places and missed these. The hold interface, the request booker, the composer and the move value object all published array{section: int, subsection: int|null} in their own signatures, for a value the engine carries and never opens. They say mixed now, with the reason written where the shape used to be.
While the key was being renamed, two classes downstream of that translation point were still reading the old one, so a claim's partition arrived empty and every confinement was silently dropped: a party asking for one part of the house was seated anywhere, a part with no room left seated the party elsewhere instead of refusing, and the sentence naming the move was never said. phpstan reported no errors throughout, because a key that is never there is not a type error. One of the two also grouped its moves on a field inside the partition, reaching into a value it may not open. It groups on the serialized partition now, so the only question it asks of two of them is whether they are the same one.
Deliberately not in this change
SCOPE_PARTITION keeps the value it stores, "section". The string is a key in the anchor table, so changing it orphans the rows of a running site until they are recounted: that is a step of its own, with the recount planned rather than discovered. The four lists where the engine hardcodes another module's field names are untouched. And the theatre in the engine's prose is untouched: seat 171, hall 39, "the house" 32. Each is its own pass.
Two test defects the pipeline found
An area picker test clicked the panel through a handle it had already found, and a redraw landing between the two round trips left it clicking a node that had left the document: the failure the trait's own value assertion was written about. It has a click twin now. And a booking page test passed a render array straight into a method that takes it by reference, for two PHP notices.
Verification
The full pipeline is green on both the current and the next major lane, kernel and functional, with the next major composer job played. Every figure in the hold cost log is identical, compared one by one: renaming moves no statement. phpstan at level 3 reports no errors, phpcs and cspell clean.
AI-Generated: Yes (Claude Code performed the rename and wrote this summary. The word is taken from revenue management practice and from the project's own docs rather than invented, after the maintainer twice corrected the method for choosing it. The reader that the rename left on the far side of the seam was found by the project's own tests, not by review.)
Issue fork yoyaku-3618720
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
Comments
Comment #3
mably commentedComment #5
mably commentedComment #7
mably commented