Architecture Decision Records (ADRs)
August 2, 2026 · View on GitHub
This directory contains Architecture Decision Records (ADRs) for Beamtalk.
ADRs document significant architectural and design decisions, including:
- Language design choices
- Implementation strategies
- Trade-offs and their rationale
Format
Each ADR follows the structure in TEMPLATE.md. Key sections:
- Status: Proposed, Accepted, Implemented, Deferred, Deprecated, Superseded, Rejected
- Context: Background, problem statement, constraints
- Decision: What was decided, with code and REPL examples
- Prior Art: How reference languages handle this
- User Impact: How this affects each user persona
- Steelman Analysis: Best argument for rejected alternatives from each user cohort
- Alternatives Considered: What else was evaluated and why it was rejected
- Consequences: Positive, negative, and neutral impacts
- Implementation: Affected components and rough phases
- Migration Path: How to migrate existing code (if applicable)
- References: Related issues, ADRs, documentation
ADR List
| Number | Title | Status | Date |
|---|---|---|---|
| 0001 | No Compound Assignment in Beamtalk | Implemented | 2026-02-08 |
| 0002 | Use Erlang Comparison Operators Directly | Implemented | 2026-02-08 |
| 0003 | Keep Core Erlang as Primary Code Generation Target | Implemented | 2026-02-08 |
| 0004 | Persistent Workspace Management | Implemented | 2026-02-15 |
| 0005 | BEAM Object Model - Pragmatic Hybrid Approach | Implemented | 2026-02-08 |
| 0006 | Unified Method Dispatch with Hierarchy Walking | Implemented | 2026-02-08 |
| 0007 | Compilable Standard Library with Primitive Injection | Implemented | 2026-02-07 |
| 0008 | Doc Comments and API Documentation | Implemented | 2026-02-15 |
| 0009 | OTP Application Structure — Split Workspace from Runtime | Implemented | 2026-02-07 |
| 0010 | Global Objects and Singleton Dispatch | Implemented | 2026-02-15 |
| 0011 | Robustness Testing — Layered Fuzzing and Error Quality | Implemented | 2026-02-15 |
| 0012 | Collection Literal Syntax and the # Data Literal System | Implemented | 2026-02-15 |
| 0013 | Class Variables, Class-Side Methods, and Instantiation Protocol | Implemented | 2026-02-15 |
| 0014 | Beamtalk Test Framework — Native Unit Tests and CLI Integration Tests | Implemented | 2026-02-15 |
| 0015 | Signal-Time Exception Objects and Error Class Hierarchy | Implemented | 2026-02-15 |
| 0016 | Unified Stdlib Packaging and Module Naming | Implemented | 2026-02-10 |
| 0017 | Browser Connectivity to Running Workspaces | Implemented (Phases 0–2) | 2026-02-17 |
| 0018 | Document Tree Code Generation (Wadler-Lindig Pretty Printer) | Implemented | 2026-02-15 |
| 0019 | Singleton Access via Class Variables | Implemented | 2026-02-15 |
| 0020 | Connection Security — mTLS, Proxies, and Network Overlays | Implemented | 2026-02-17 |
| 0021 | Stream — Lazy Pipeline for Value-Side Data | Implemented (Revised) | 2026-02-15 |
| 0022 | Embedded Compiler via OTP Port (with NIF option) | Implemented | 2026-02-15 |
| 0023 | String Interpolation Syntax and Compilation | Implemented | 2026-02-17 |
| 0024 | Static-First, Live-Augmented IDE Tooling | Implemented (Phase 1) | 2026-02-17 |
| 0025 | Gradual Typing and Protocols | Implemented (Phases 1–2) | 2026-02-15 |
| 0026 | Package Definition and Project Manifest | Implemented | 2026-02-17 |
| 0027 | Cross-Platform Support | Implemented | 2026-02-17 |
| 0028 | BEAM Interop Strategy | Implemented | 2026-02-17 |
| 0029 | Streaming Eval Output | Implemented | 2026-02-18 |
| 0030 | cargo-dist Evaluation for Release Packaging | Rejected | 2026-02-18 |
| 0031 | Flat Namespace for v0.1 | Superseded by 0070 | 2026-02-18 |
| 0032 | Early Class Protocol — Behaviour and Class in Beamtalk Stdlib | Implemented | 2026-02-24 |
| 0033 | Runtime-Embedded Documentation on Class and CompiledMethod | Implemented | 2026-02-24 |
| 0034 | Stdlib Self-Hosting — Moving Logic from Erlang to Beamtalk | Implemented | 2026-02-24 |
| 0035 | Rename Instance Variable Reflection API from instVar to field | Implemented | 2026-02-24 |
| 0036 | Full Metaclass Tower | Implemented | 2026-02-24 |
| 0037 | Collection Class Hierarchy — Shallow Abstract Layer with Minimal Primitive Surface | Implemented | 2026-02-24 |
| 0038 | subclass: Grammar Desugaring to ClassBuilder Protocol | Implemented | 2026-02-24 |
| 0039 | Syntax Pragmatism vs Smalltalk | Implemented | 2026-02-24 |
| 0040 | Workspace-Native REPL Commands, Facade/Dictionary Split, and Class-Based Reload | Implemented | 2026-02-24 |
| 0041 | Universal State-Threading Block Protocol | Implemented | 2026-02-24 |
| 0042 | Immutable Value Objects and Actor-Only Mutable State | Implemented | 2026-02-26 |
| 0043 | Sync-by-Default Actor Messaging | Implemented | 2026-02-26 |
| 0044 | Comments as First-Class AST Nodes | Implemented | 2026-02-28 |
| 0045 | REPL Expression-Level Completion via Gradual Type Inference | Implemented | 2026-03-01 |
| 0046 | VSCode Live Workspace Sidebar | Implemented | 2026-03-02 |
| 0047 | Return Type Arrow Token Disambiguation | Implemented | 2026-03-02 |
| 0048 | Class-Side Method Syntax Redesign | Deferred | 2026-03-02 |
| 0049 | Remove Method-Level sealed — Infer Protection from @primitive/@intrinsic | Deferred | 2026-03-02 |
| 0050 | Incremental Compiler ClassHierarchy via BEAM Metadata Streaming | Implemented | 2026-03-04 |
| 0051 | Subprocess Execution — System Commands and Interactive Subprocess Actor | Accepted | Implemented | 2026-03-05 |
| 0052 | Recursive Descent Parser with Pratt Parsing for Binary Operators | Accepted | Implemented | 2026-03-05 |
| 0053 | Double-Colon Type Annotation Syntax | Implemented | 2026-03-05 |
| 0054 | Communication Protocols | Accepted | Implemented | 2026-03-05 |
| 0055 | Erlang-Backed Class Authoring Protocol | Implemented | 2026-03-06 |
| 0056 | @native — Erlang-Backed Actors | Accepted (partial) | 2026-03-07 |
| 0057 | Authoritative Superclass Source for Abstract Stdlib Classes | Implemented | 2026-03-07 |
| 0058 | Platform Security Model | Accepted (policy) | 2026-03-07 |
| 0059 | Supervision Tree Syntax | Implemented | 2026-03-07 |
| 0060 | Result Type — Hybrid Error Handling for Expected Failures | Implemented | 2026-03-08 |
| 0061 | Program Entry Points and Run Lifecycle | Implemented | 2026-03-10 |
| 0062 | Bundled Example Corpus and Search Tool for MCP Server | Implemented | 2026-03-15 |
| 0063 | Remove File Path Sandbox | Implemented | 2026-03-16 |
| 0064 | Runtime Logging Control and Observability API | Implemented | 2026-03-17 |
| 0065 | Complete OTP Primitives for Actor Lifecycle and Supervision | Implemented | 2026-03-17 |
| 0066 | Open Class Extension Methods (>> Syntax) | Implemented | 2026-03-18 |
| 0067 | Separate state:/field: Keywords by Class Kind | Implemented | 2026-03-18 |
| 0068 | Parametric Types and Protocols | Accepted | Implemented | 2026-03-20 |
| 0069 | Actor Observability and Tracing | Accepted | Implemented | 2026-03-21 |
| 0070 | Package Namespaces and Dependencies | Implemented | 2026-03-24 |
| 0071 | Class Visibility — internal Modifier for Package-Scoped Access Control | Implemented | 2026-03-28 |
| 0072 | User Erlang Sources in Beamtalk Packages | Implemented | 2026-03-29 |
| 0073 | Package Distribution and Discovery | Implemented (Phase 1; Phase 2 implemented in simplified form, amended 2026-07-26) | 2026-03-31 |
| 0074 | Deferred Metaprogramming | Accepted (deferral) | 2026-04-01 |
| 0075 | Erlang FFI Type Definitions | Implemented (Phase 1; Phase 2 deferred) | 2026-04-02 |
| 0076 | Convert Erlang ok/error Tuples to Result at FFI Boundary | Implemented | 2026-04-03 |
| 0077 | Type Coverage Visibility | Implemented | 2026-04-05 |
| 0078 | Actor Initialize Inheritance | Implemented | 2026-04-12 |
| 0079 | Named Actor Registration | Implemented | 2026-04-15 |
| 0080 | Migrate Supervisor Lifecycle to Result | Implemented | 2026-04-16 |
| 0081 | First-Class Session Object — Walkable Binding Layers | Proposed | 2026-05-09 |
| 0082 | Method-Level Edit and Save in the Live Workspace | Implemented | 2026-05-17 |
| 0083 | Metaclass-Aware Type Inference | Implemented | 2026-05-23 |
| 0084 | Class-Side Runtime Method Installation and Fun Dispatch | Accepted (in progress) | 2026-05-24 |
| 0085 | Editor Live-Image Representation | Proposed | 2026-05-24 |
| 0086 | Make String a Subclass of Binary | Implemented | 2026-03-21 |
| 0087 | Maintained Selector→Sites Cross-Reference Index for SystemNavigation | Accepted | 2026-05-26 |
| 0088 | Direct Core Erlang AST Emission via ETF | Phases 1–4 Rejected; Wire Deferred | 2026-05-26 |
| 0089 | Typed Document Leaves for Core Erlang Codegen | Accepted | 2026-05-28 |
| 0090 | Canonical Array Representation for O(log n) at:put: | Accepted | 2026-06-02 |
| 0091 | Connection Security for Remote Workspace Access — Phoenix as Authenticated Front | Accepted | 2026-06-06 |
| 0092 | Supervision Tree Introspection API (Runtime Query Surface) | Implemented | 2026-06-07 |
| 0093 | Announcements — Typed Event Substrate (Runtime Bus + stdlib Veneer) | Accepted | 2026-06-07 |
| 0094 | Object String Representation Protocols (printString / displayString / inspect) | Proposed | 2026-06-07 |
| 0095 | Rich Navigable Inspector — Drillable, Live-Refreshing Object Views | Accepted | 2026-06-11 |
| 0096 | System Browser Data Source — Class/Method Browse API for the LiveView IDE | Proposed | 2026-06-10 |
| 0097 | Desktop Attach Client — One Front Node per Workspace | Proposed | 2026-06-13 |
| 0098 | Build Artifact Provenance and Version-Based Staleness Invalidation | Accepted | 2026-06-23 |
| 0099 | CLI Application Story — Console, Arguments, Exit, and Packaging | Accepted | 2026-06-26 |
| 0100 | Open-World Diagnostic Policy for Unresolved Selectors and Classes | Proposed | 2026-06-27 |
| 0101 | Unified Erlang Interop — native: for Stateless Objects, Wrap-by-Default FFI, Clean @primitive/@intrinsic/native: Split | Accepted | 2026-06-28 |
| 0102 | Set-Theoretic Type Operators (Intersection and Negation) for Narrowing and Atom Exhaustiveness | Implemented (Phases 1, 2, 4, 5; Phase 1b deferred) | 2026-07-06 |
| 0103 | Sendability Typing from Class Kinds | Proposed | 2026-07-05 |
| 0104 | Typed Actor Protocols — the Class Interface Is the Protocol | Accepted | 2026-07-07 |
| 0105 | Live Image Re-Checking on Hot Reload | Accepted | 2026-07-11 |
| 0106 | Opt-In Asserted match: Exhaustiveness (matchExhaustive:) | Implemented | 2026-07-07 |
| 0107 | Nil and Type Patterns in match: | Accepted | 2026-07-12 |
| 0108 | Named Union Type Aliases (type Declarations) | Accepted | 2026-07-15 |
| 0109 | Block-Scoped Class Methods Run Their Block in the Caller's Process | Accepted | 2026-07-28 |
| 0110 | Class-Variable Shadow Write-Through for Foreign NLR Relay | Accepted | 2026-08-02 |
ADR 0086 was originally numbered 0069 (a collision with Actor Observability and Tracing) and was renumbered on 2026-05-25.
Creating New ADRs
- Number sequentially: Use the next available number (0003, 0004, etc.)
- Use descriptive titles: Make it clear what decision is being made
- Document thoroughly: Include context, rationale, and consequences
- Link to issues: Reference Linear issues (e.g., BT-XXX) where relevant
- Update this index: Add your ADR to the table above