A contributor arriving at Orchestra knows Drupal, not Orchestra. Every word we invent for something core already names is a word they have to learn for no reason. This audit checked every class, interface, trait, enum, method, plugin id, route, service id, permission and config key in the module against core's own vocabulary, and this issue fixes the places where we spent a word core does not use for something core does name.
How it was checked. Every candidate word was counted against a corpus of 24,173 identifiers taken from core's class, interface, trait, enum and method names in core/lib and core/modules. A word with zero hits in core is an invention. An invention is only a defect where core already has a word for the same thing; where the domain is genuinely outside core, the invention is correct and is deliberately kept.
Already correct, and left alone. All 484 production filenames match the type they declare. All 70 interfaces end Interface and all 27 traits end Trait. Capability interfaces use core's adjective form (AssignableInterface, RetryableExceptionInterface), with no Supports*Interface anywhere. Enums are bare nouns in core's style. All 91 plugin ids are snake_case, all 64 route names are prefixed, service ids are prefixed or core-shaped, CSS is BEM throughout, and all 697 test method names pass the phpcs lowerCamel rule.
Proposed resolution
- American spelling.
cancelledappears on 221 lines, including four stored state constants (STATE_CANCELLED = 'cancelled'on the process instance, the token, the work item and the incident). Core spells itcanceled45 times against 9, andlabeled15 times against 1.StatusCatalogueand its interface are British too; core has neither spelling, and core's word for "which of these are available here" isRepository(27 classes), so it becomesStatusRepository. - Hook classes take core's suffix. Core's
Hook/directories hold 371 classes endingHooksagainst 15 endingHook, then only*Requirements,*Alterand*Operations. Of our 34, only 8 endHooks; the others endHook,Cleanup,Sweep,Deletion,Tokens,Scope,Invalidation,Healer,GuardorCancellation. They take the shape core uses throughout, the extension name then the topic then Hooks, as inNodeTokensHooksandViewsThemeHooks. explain()becomessummary(). Our flow condition is a condition plugin type, and core'sConditionInterfacedeclares this exact method assummary().explainhas zero hits in core, so a contributor arriving from core'sConditionlooks forsummary()and does not find it.forget()becomesdelete()orreset().forgetandrecallboth have zero hits in core, which usesreset()34 times andresetCache()10.OrchestraReturnis a key-value store in all but name, and core'sKeyValueStoreInterfacespells the pairget()anddelete().figurebecomes the amount vocabulary.orchestra_paymentspendsamount69 times andfigure43 times on the same axis. The distinction being drawn is real, the raw value against the formatted display string, but the word is not; the constants beside it already saySHOWN_QUERY.projectis the word Drupal keeps for a drupal.org project. All 59Project*identifiers in core are that noun and none is the verb.projectToConfig()andprojectFromConfig()join thetoConfig()andfromConfig()pair the module already uses elsewhere, which also retires the third and fourth spellings of one idea,toWorking()andharvest().- Agent nouns core never forms. Core has zero
Healer,Drainer,SweeperandSurvey, against 187Provider, 142Manager, 135Handler, 24Previewand 13Processor.MigrationSurveybecomesMigrationPreview, matching thePayablePreviewwe already have, andStepClassbecomesStepCssClass, since it builds CSS classes and its old name read as the PHP class of a step. Seven classes sitting inEventSubscriberdirectories did not endSubscribereither; core has 111 that do. Thedrainandsweepfamilies are deliberately left: both are used consistently for one idea across the engine's hottest path, andprocessdoes not carry the bounded-until-empty meaning thatDrainStateexists to track. - snake_case where Drupal spells snake_case. The config keys
flowLabelsandnodeLabelssit directly beside their own siblingsnodesandflows, and becomeflow_labelsandnode_labels. The public parameters$actorUid,$completerUidand$checkExpirysit beside our own$node_idand$token_idin the same files. - The
actvocabulary becomesaction.actas a noun has zero hits in core, and named the link that opens the thing a person has to do. Core calls that an operation, but we already spendoperationon three different things and two of them are core's own meaning, so it cannot move.actionis what this code already called it:OperationController::actionLinks()took a$actionwhose own docblock read "a pending-actions finder entry (outcomes with urls,act_url,act_label)", it lives inPendingActionsFinderbesidePendingActionHandlerInterface, and the French for the views field already read "Lien d'action". SoactionUrl(),actionLabel(),actionAccess(),PendingActionLabel,TaskActionLink, theaction_labelconfig key, theaction_linkviews field and theorchestra-action--{node}classes. Core's Action plugin sense (orchestra_action,ActionTask) is a different subject and is untouched, as is the verb inactingFor(). - Smaller ones.
view own process instancesis the only one of eleven permissions that does not name the module, right next to its siblingaccess orchestra instances.TaskDispositionandJoinDecisionare two enums in one namespace with the same shape and two different words.activeChips()is Material Design vocabulary that Claro does not use.noteBoundary()records when a delegation next changes, so it isrecordNextChange(), andvoteValue()readsCompletion::OUTCOME_KEY, so it isoutcomeValue().inertAction(),landingPage(),cohortClosed(),qualify()andcatchUp()are left alone: each turned out to be consistent, load-bearing vocabulary tied to a shipped config key, a CSS class, a base field or an XML term, not a stray metaphor.
Deliberately kept. Core has no word for a workflow engine's furniture, so these stay exactly as they are and a later sweep must not "fix" them: token, park, gateway, join, split, instance, signal, outcome, advance, subprocess, tenant, incident, deadline, timer, audience, initiator, delegation, work item, continuation, checkout, payable. JoinInterface::arrive() is BPMN's own verb for a token reaching a join and stays too, despite zero hits in core.
Deliberately not in this change
One finding needs a decision rather than a rename, and is recorded here so it is not re-litigated later.
Accessor density. 22.9% of core's method names begin get (2276 of 9942). Ours is 9.0% (90 of 1005), which is 40% of core's density. 409 of our methods carry no verb at all, and 364 of those have no core precedent as a bare name: instance(), deadline(), outcomes(), recipients(), successors(), milestones(), refusals() and so on. This is the largest readability gap left in the module, but each one is a separate judgement about whether the method reads as a question, a predicate or an action, so it does not belong in a mechanical rename pass.
Remaining tasks
No update path is provided. The module is pre-1.0 and alpha releases are reinstall-only, so the stored state values, the config keys and the affected plugin ids change in place. The French translations and the documentation move in the same merge request.
AI-Generated: Yes (Claude Code was used to run this naming audit against Drupal core's vocabulary, to draft this issue summary, and to write the renames on the merge request. I reviewed the work before posting it.)
Issue fork orchestra-3618935
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 #2
mably commentedComment #4
mably commentedComment #5
mably commentedComment #7
mably commented