Tenant copy overrides, namespace by namespace. Core.
messages is the tenant's own wording: the third layer over the shipped copy, live without a redeploy. "Order" becomes "Booking" here.
messages: one row per language and namespace, the overrides as a document of dotted paths.
The copy admin at /text lists every shipped key of one namespace in one language, the shipped string as the input's placeholder and the tenant's override as its value. Clearing a row restores the base. An override whose placeholders differ from the shipped string's is rejected, so a reworded label cannot drop a count it interpolates.
Text edit mode reaches the same layer from any admin page. With the mode armed, every string that came from the catalogue is identifiable in place; hovering outlines it and names its path, and Alt-clicking opens an editor that writes the override for exactly that path. The identity travels inside the string itself as an invisible prefix, so no component has to carry an attribute.
Both, and the assistant, write through one database function that merges per path, so an admin's edit and an assistant's write to the same namespace never replace each other.
manage_copy: one namespace of one language, as a flat map of paths.
messages.manage.
Never. Every project links it at provisioning.