The forbidden ledger is part of the language contract: it prevents familiar syntax from JavaScript, Python, Rust, and earlier Topaz drafts from silently becoming a second dialect.
Policy
Canonical code uses let mut, Array<T>, (T) -> U, ...args: T, list rest ..rest, lambdas, registry-tagged double-quoted templates, postfix Result ?, locked module imports/inline exports, and explicit concurrent. A form absent from the specification or denied by the active profile is not accepted merely because a backend language supports it.
Specified behavior
The shared checker should reject forbidden shapes before backend selection. When a feature is specified but excluded by a profile—such as function composition in public docs—the profile is the active surface authority. When a backend lacks evidence for an otherwise accepted shape, it must decline loudly or keep it outside its claim rather than reinterpret the source.
Constraints and loud decline
Rejected families include alternate binding/operator spellings, string indexing/slicing, legacy collection/function/variadic types, noncanonical pattern rest, JavaScript record spread, Rust ownership/receiver/interop tokens, anonymous function expressions, backticks and ${...}, user template tags, assert/try/panic forms, module re-export families, invalid explicit generics/bounds, expanded nominal/protocol forms, broader loop/comprehension/resource forms, bitwise operators, async/await, and catchable faults.
Deferred boundary
Deferred does not mean partially supported. Grapheme APIs, HTML or user-defined templates, higher-rank generics, broad protocol dispatch, package re-exports, general iteration and spread, async and cancellation syntax, fault catching, and other roadmap candidates remain unavailable until a future language version accepts and documents them.
Worked example
let mut count = 0
let values: Array<int> = []
let transform: (int) -> int = value => value + 1
match values {
case [head, ..tail] => { count = transform(head) }
case [] => { count = 0 }
}