Vitte Normative Specification Skeleton

This document defines the required normative sections for stabilizing Vitte beyond the current bootstrap subset. Each section is intentionally concise for now, but it is binding: implementation, diagnostics, fixtures, and generated documentation must converge here instead of inventing incompatible rules.

Memory Model

Vitte memory semantics are ownership-first. Moves invalidate the previous owner, shared and mutable aliases are mutually exclusive, and references must not outlive their owning region. Unsafe code may extend the expressible surface, but it does not erase diagnostics at safe boundaries.

Modules And Imports

Modules are named by canonical space paths. Imports must resolve deterministically, cycles are rejected unless an explicitly documented future phase supports them, and public surfaces must be exported intentionally.

ABI

ABI declarations must specify calling convention, layout expectations, target family, and symbol visibility. A backend may reject an ABI profile if layout, pointer width, object format, or linker contract is not known.

Unsafe

Unsafe operations are lexically explicit and must remain auditable. The checker must track escape paths from unsafe values ​​back into safe code and attach diagnostics to the boundary where the guarantee is lost.

Traits And Generics

Trait implementations must be consistent for a given type and trait pair. Generic constraints must be resolved before codegen. Associated types are part of the trait contract and must be normalized consistently during type checking.

Effects And Async

Effects describe observable capabilities such as IO, allocation, concurrency, and unsafe interaction. Async suspension points must preserve borrow and lifetime invariants across the suspended region.

Macros And Comptime

Macros and comptime execution must be deterministic for a given input, compiler version, feature set, and target profile. Expansion must preserve source mapping for diagnostics.

Version Compatibility

Language editions define compatibility boundaries. Stable features require parser, semantic checks, diagnostics, codegen or explicit rejection, tests, and documentation. Experimental features must be marked as such.