Each file is one module, and the entry plus its transitive import closure forms one single-root compilation unit with explicit private-by-default visibility.
Policy
Imports form a top-level prologue. import a.b binds the final segment as a namespace, optionally with as; import a.b { name, other as local } selects exported names. Inline export applies to one declaration or legal binding. Module paths are dotted identifiers mapped to exact Unicode-scalar file paths under the root. A namespace is a compile-time resolution object used for one exported member or a qualified exported type, never a runtime value.
Specified behavior
Only the entry and transitive closure are checked. Every import edge participates in cycle rejection. Imported modules initialize once in normative dependency order before entry execution; const items add no runtime step, and forward/self runtime-binding references in imported initializers are statically blocked. Imported modules allow declarations and bindings but reject runtime-bearing free statements. Names are private unless exported, imported bindings are read-only, and selected nominal names preserve their defining identity.
Constraints and loud decline
Side-effect-only imports, use, string/template paths, import alias plus selection, export lists, wildcard export, re-export, export-site renaming, export let mut, duplicate imports, cycles, escaping the root, private member access, and namespace-qualified nominal brace construction are rejected. There is one root, two visibility levels, no package manifest semantics, and no implicit parent module.
Deferred boundary
Package manifests, dependencies, registries, version constraints, multi-root builds, package visibility, re-export syntax, side-effect imports, type-only cycle exceptions, and foreign-syntax module forms are deferred. Future interop remains module-granular and labeled at the producer/build boundary; import syntax stays ordinary Topaz.
Worked example
import math { add as sum }
import text.format as fmt
export function total(left: int, right: int) -> int {
return sum(left, right)
}
let label = fmt.number(total(2, 3))