Architecture Decision Records
Architecture Decision Records (ADRs) capture the significant design decisions behind Gruel — the context that motivated them, what was chosen, and the trade-offs involved. They are the historical record of "why did we do it this way?"
Individual ADRs are listed below. For the broader process (when to write one, lifecycle, tags), see the ADR README on GitHub.
Chapters
- ADR-0001: The Never Type
- ADR-0002: Single-Pass Bidirectional Type Checking
- ADR-0003: Constant Expression Evaluation
- ADR-0004: Enum Types
- ADR-0005: Preview Features
- ADR-0006: Unified Zola Website
- ADR-0007: Hindley-Milner Type Inference
- ADR-0008: Affine Types and Mutable Value Semantics
- ADR-0009: Struct Methods
- ADR-0010: Destructors
- ADR-0011: Runtime Heap
- ADR-0012: Compiler Optimization Passes
- ADR-0013: Borrowing Modes
- ADR-0014: Mutable Strings
- ADR-0015: Test Suite Optimization
- ADR-0016: Preview Feature Infrastructure
- ADR-0017: Emitter Instruction Abstraction
- ADR-0018: Tracing Infrastructure
- ADR-0019: Compiler Performance Dashboard
- ADR-0020: Built-in Types as Synthetic Structs
- ADR-0021: Standard Input
- ADR-0022: Integer Parsing
- ADR-0023: Multi-File Compilation
- ADR-0024: Type Intern Pool - Revised Approach
- ADR-0024: Type Intern Pool
- ADR-0025: Compile-Time Execution (comptime)
- ADR-0026: Module System
- ADR-0027: Random Number Intrinsics
- ADR-0028: Unchecked Code and Raw Pointers
- ADR-0029: Anonymous Struct Methods (Zig-Style)
- ADR-0030: Place Expressions for Memory Locations
- ADR-0031: Robust Performance Testing Infrastructure
- ADR-0032: Data Structure Selection for Small Collections
- ADR-0033: LLVM Backend and Comptime Interpreter
- ADR-0034: Replace CFG-Level Optimization Passes With LLVM Equivalents
- ADR-0035: Heap Allocator - Use libc malloc
- ADR-0036: Struct Destructuring and Partial Move Ban
- ADR-0037: Enum Data Variants and Full Pattern Matching
- ADR-0038: Enum Struct Variants (Named-Field Enum Variants)
- ADR-0039: Anonymous Enum Types
- ADR-0040: Comptime Interpreter Expansion and Differential Fuzzing
- ADR-0041: For-Each Loops
- ADR-0042: Comptime Metaprogramming — Diagnostics, Strings, Reflection, and comptime_unroll For
- ADR-0043: Extended Benchmark Infrastructure — Comptime, Opt Levels, and Runtime
- ADR-0044: LLVM Codegen Quality Improvements and Build Profiles
- ADR-0045: Consistent String Interface and Comptime String Materialization
- ADR-0046: Extended Numeric Types (isize/usize, f16/f32/f64, comptime_int)
- ADR-0047: Unify @dbg and @compileLog
- ADR-0048: First-Class Tuples
- ADR-0049: Nested Destructuring and Pattern Matching
- ADR-0050: Centralized Intrinsics Registry
- ADR-0051: Recursive Pattern Lowering
- ADR-0052: Complete Recursive Pattern Matching
- ADR-0053: Unified Inline Methods and Drop Functions (Retire `impl` and Top-Level `drop fn`)
- ADR-0054: Use usize for Indexing
- ADR-0055: Anonymous Functions (Closures-as-Structs)
- ADR-0056: Structurally Typed Interfaces (Comptime Constraints + Dynamic Dispatch)
- ADR-0057: Anonymous Interfaces (Comptime-Constructed)
- ADR-0058: User-Defined Derives via `derive` Items
- ADR-0059: Drop and Copy as Interfaces
- ADR-0060: Complete Interface Signatures (Self + Receiver Modes)
- ADR-0061: Generic Pointer Types
- ADR-0062: Reference Types Replacing Borrow Modes
- ADR-0063: Pointer Operations as Methods on Ptr / MutPtr
- ADR-0064: Slices
- ADR-0065: Clone Interface and Canonical Option(T)
- ADR-0066: Vec(T) — Owned, Growable Vector with On-Demand Sentinel
- ADR-0067: Linear Types in Containers (Vec, Array, Option)
- ADR-0068: Remove Slice Sentinel Support
- ADR-0069: Layout Abstraction and Niche-Filling for Enums
- ADR-0070: Canonical Result(T, E)
- ADR-0071: char — Unicode Scalar Value Type
- ADR-0072: String as a Newtype Wrapper over Vec(u8)
- ADR-0073: Field and Method Visibility
- ADR-0074: Incremental Compilation with File-Level Caching
- ADR-0075: Handle interface; retire `@handle`; reject unknown directives
- ADR-0076: Pervasive `Self` and Sole-Form References
- ADR-0077: LLVM-backed target system
- ADR-0078: Stdlib MVP — Prelude on Disk, Built-in Declarations to Gruel, and Eq/Ord Operator Interfaces
- ADR-0079: Prelude Split, Lang Items, and Prelude-Driven Derives
- ADR-0080: `copy` keyword for Copy types
- ADR-0081: String Runtime Collapse onto Vec(u8)
- ADR-0082: Vec Runtime Collapse onto Gruel Primitives
- ADR-0083: `@mark(...)` directive for marker traits
- ADR-0084: Markers for `Send` and `Sync`
- ADR-0085: C foreign function interface via `@mark(c)` and `link_extern` blocks
- ADR-0086: C FFI extensions — C named primitives, enum FFI, static linking
- ADR-0087: Prelude fns for libc-wrapper intrinsics
- ADR-0088: `@mark(unchecked)` on methods and mandatory on FFI imports
- ADR-0089: Docstrings and a doc-dump CLI
- ADR-0090: Tree-sitter Grammar and Parser Differential Fuzzing
- ADR-0091: Language Server (LSP) for Gruel
- ADR-0092: Package Manifest (`gruel.json`)
- ADR-0093: `gruel fmt` source formatter