Post

Dea/L0 v1.0.0 released

Dea/L0 v1.0.0 released

Updated 2026-07-21: Dea/L0 has since reached 1.1.0. See the Dea/L0 1.1.0 release announcement for the current release notes.

I have released Dea/L0 v1.0.0, level zero of the Dea systems programming language.

This release is a major milestone for Dea. It improves the language surface, the standard library, compiler parity, diagnostics, Stage 2 reliability, test infrastructure, documentation, release processes, and CI workflows.

Dea/L0 is designed for writing compilers and low-level tools. It has a C-family syntax, a C99 backend, and a strict no-undefined-behavior policy. The compiler is written in Dea/L0 itself, with built-in observability and clear diagnostics intended to support systems tool development.

I described Dea/L0 in more detail in the v0.9.0 release announcement, which gives more background on the language and its design goals.

This post focuses on what changed in v1.0.0.

New features

Language surface

This release adds native string operators, so string comparison and related operations now use normal language syntax, such as name != "" or "a" < "b", instead of helper functions.

String concatenation is now part of the language surface as well, using +. Code can now write expressions such as "a" + "b" directly. As part of this change, compiler and library code were migrated away from older string helper calls such as concat_s and concat*_s.

The release also adds pointer identity equality operators, allowing pointer values to be compared for identity where the language permits it.

Bare enum variants are now supported everywhere, including in top-level bindings. For example, a variant with no fields can now be written as Red instead of Red(). This makes enum-heavy code more concise and readable.

Standard library and runtime

The integer helper module has been renamed from std.math to std.integer, making its purpose more explicit. The module also gained additional arithmetic utilities and runtime checks.

Several shared standard-library container type names were cleaned up, including names used by vectors, hash maps, hash sets, and linear maps.

Standard-library reference documentation has been improved as well. Function signatures now show the explicit func keyword, and struct fields are listed in the generated reference docs.

Low-level memory functionality has moved from sys.unsafe to sys.memory. The new name describes what the module provides, rather than describing only its risk profile.

Runtime foreign-function declarations were also updated so pointer parameters that may be null are represented as optional pointer types.

Compiler parity and diagnostics

Dea/L0 now has a shared diagnostic-code catalog. Compiler errors and warnings are registered centrally, instead of relying on scattered local definitions.

This release also adds oracle coverage for diagnostics. Tests now check that compiler stages continue to use the expected diagnostic codes and messages as the implementation evolves.

Diagnostic-code policy and catalog entries were updated to reflect current compiler behavior, and shared scripts for comparing diagnostic behavior across compiler implementations were added and refined.

Stage 2 and test infrastructure

L0 tooling scripts have been ported from shell to Python. This makes them easier to test and more portable across platforms.

Shared Python tooling was refactored into the monorepo workspace, and compiler stage runner helpers were moved and revised under script directories.

The L0 test-stage1 command now supports quiet progress output, reducing noisy test logs while preserving failure details. Stage 1 pytest output was refined in the same mode.

This release also adds check-examples validation gates, so example programs are checked automatically. A monorepo-level test-all target now runs the broader validation suite from one place, and an L0 clean-all target performs deeper cleanup of generated build and test artifacts.

A trace troubleshooting project skill was added for diagnosing ARC and memory trace failures.

Documentation and work tracking

Documentation and work tracking were reorganized so stable docs and active plans live in clearer locations.

Project status pages were moved into the main documentation roots, making status information easier to find. Root and shared ADR catalog docs were added, along with L0-specific ADR catalog documentation. ADRs, or architecture decision records, explain durable design choices.

Live documentation was refreshed to match the current implementation.

Several workflow and project skills for AI assistants were added or improved:

  • create-dea-plan
  • finalize-dea-work
  • refresh-stale-docs
  • show-open-plans
  • troubleshoot-trace-failures

The release also adds guidance for readable roadmap links, initiative metadata, commit summary wording, commit validation, autonomous work completion, and project-plan creation.

Copilot instructions were added for monorepo usage and workflows, and the grammar documentation was updated for intrinsic functions and bare match variants.

Release and versioning

The L0 version was bumped to 1.0.0.

Release-facing docs were refreshed for the l0-v1.0.0 preparation, and L0 release workflows were refactored to align with GitHub’s immutable release artifact model.

Versioned API reference archive names were added, such as dea_l0_api_reference-<TAG>.tar.gz, and release archives now include the full L0 documentation set.

The L0 distribution metadata example was refreshed, and public repository links were updated to the unified googlielmo/dea-lang repository.

CI, workflows, and distribution

This release introduces unified CI orchestration, giving the monorepo a shared top-level workflow that can coordinate level-specific checks.

Windows uv diagnostics were added to CI to make Python environment failures easier to understand, and Windows MSYS2 coverage was expanded for L0-related workflows.

Pages output and blog export artifacts are now published from the release workflow. Release blog export was decoupled from GitHub Pages deployment, so one can succeed, fail, or be skipped without blocking the other. Pages deployment is also skipped automatically when GitHub Pages is unavailable.

Root and shared workflow metadata, along with dependency metadata, were updated.

Fixes

Language, codegen, and runtime fixes

Pointer indexing remains intentionally unsupported, but compiler stages now agree on the diagnostic reported when it is used.

Code generation for nullable values using the ? niche representation was fixed, avoiding incorrect C output for some optional-value cases.

Constructor handling through type aliases for structs is now consistent again.

Obsolete defensive string clones were removed where they were no longer needed and could obscure ownership behavior.

Cleanup behavior was fixed when borrowed ARC-managed parameters are reassigned. ARC is the automatic reference-counting system used for owned runtime values such as strings and containers.

Cleanup was also fixed for casted assignment targets when null propagation is involved.

Top-level ARC cleanup behavior was corrected, and diagnostics for invalid drop usage were improved.

The intended ARC reassignment behavior is now documented, making ownership rules easier to audit.

Compiler parity and diagnostics fixes

Native diagnostic-code parity was restored between Stage 1 and Stage 2 compilers. Both implementations now report the same registered diagnostic code for the same class of error, instead of drifting apart.

Diagnostics for nested symbol paths were aligned across compilers, so qualified modules and nested references are reported consistently.

Duplicate diagnostic codes were removed from parser error messages.

Fatal diagnostics for duplicate local declarations are now consistent again.

Shared typing and statement-checking behavior in the self-hosted compiler was restored so it matches the reference compiler more closely.

Diagnostic printers were refined, improving how compiler errors and warnings are formatted for users.

Windows diagnostic parity tests were fixed so diagnostic comparisons remain reliable on Windows.

Diagnostics for PAR-0010, the parser code used when reserved syntax is recognized but intentionally not supported yet, were clarified.

Stage 2, tooling, and workflow fixes

Obsolete checks for L0 runtime library artifacts were retired because they no longer matched the current build model.

The L0 documentation workflow entrypoint was fixed.

Validation of activation hints and Docker test context setup was fixed.

A Windows CI Stage 2 regression introduced after porting runner scripts to Python was fixed.

Cleanup behavior in lexer trace paths was corrected, and trace-target coverage was added.

The MSYS2 Windows CI plan was closed after the related workflow coverage landed.

The Windows trace-runner pipe-capture plan was closed after the runner behavior was addressed.

What’s next

With v1.0.0, L0 now provides a stable base for the next levels of the Dea language.

Its evolution does not stop here: the long-term vision is for L0 to remain a minimal, live kernel for language experimentation.

Work on Dea/L1 is now underway. If staged bootstrap work, compiler implementation, or small systems languages interest you, contributions are welcome. See CONTRIBUTING.md for setup and guidelines. AI-assisted contributions are encouraged.

This post is licensed under CC BY 4.0 by the author.