Modules and their graphadvanced
Declaring what each module depends on turns a layering convention into something the compiler enforces, and it is the difference between a rule everyone agrees with and a rule nobody can break.
The module graph is where the layering stops being a convention and becomes a rule. Wire it, and give every layer one shared vocabulary that ships inside the assembly.
The graph compiles bottom-up, and the contracts module cannot see an entity.
Published in full, before you start — every point is one of these and there is nothing else.
Declaring what each module depends on turns a layering convention into something the compiler enforces, and it is the difference between a rule everyone agrees with and a rule nobody can break.
Text, enums and constants that several layers need have to live at the bottom of the dependency graph and travel with the module that owns them — otherwise a module installed elsewhere arrives without its own translations.