REXX Language implementation
Status: draft plan for maintainer review and GitHub discussion, updated for the beta 3 foundation work completed through 2026-08-23. Date: 2026-08-23. Target release: end of August 2026.
This plan describes the intended path from the tagged v1.0.0-beta.2 release
baseline through the beta 3 foundation milestone to Release 1. It is not itself
a release contract. After the GitHub discussion is approved, create the issue
candidates below as GitHub issues with owners, labels, acceptance criteria, and
fallback decisions.
Beta 3 issue candidates and working team guidance are captured in
planning/beta-3/issue-candidates.md
before they are turned into GitHub issues.
The release date is fixed. Scope is managed by tiering.
Release 1 should ship a coherent, stable Level B toolchain with a credible first Level G layer, a visible Level C compatibility milestone, and a clear path for language-engineering work. It should not try to make every future level stable.
The final two-week sprint is for QA, documentation, usability, examples, packaging, and performance validation. User-facing feature work should be complete by 2026-08-14 unless it is fixing a must-ship release defect.
| Date | Gate | Exit condition |
|---|---|---|
| 2026-06-17 | Beta 3 opens | Beta 2 has a tag, beta 1 to beta 2 delta is documented, develop is labelled beta 3 WIP, and the beta 3 planning note exists. |
| 2026-07-03 | Design lock | Level B/G split, plugin policy, UTF ownership, Level C MVP, GPU/threading scope, and issue owners/labels are approved. |
| 2026-07-31 | Beta 3 foundation target | High-risk VM/compiler foundations either landed with tests or moved out; large constants, perfect-hash select, Level C canonical-AST lowering proof, and beta 3 package shape have explicit go/no-go decisions. |
| 2026-08-14 | Feature complete | User-facing surface is frozen; demos and tutorials are ready for manual testing; known limitations are drafted. |
| 2026-08-31 | Release 1 | Release 1 is shipped, or a release candidate is ready with explicit residual risks. |
Must-ship items are part of the Release 1 contract or release process.
Beta 3 branch baseline
Keep v1.0.0-beta.2 release notes as the historical beta 2 baseline, point
current develop documentation at v1.0.0-beta.3 WIP, and keep the beta 3
planning note aligned with this timetable. Do not call beta 3 released until
the v1.0.0-beta.3 tag and assets exist.
Release 1 governance
Open the GitHub discussion from the approved version of this plan. Create
issues for must-ship and should-ship items only after the discussion is
accepted. Use labels for must, should, experimental, and post-r1.
Level B lockdown
Freeze Level B syntax and stable library surface by 2026-07-03. Complete documentation and tests for UTF/binary, references, arrays, collections, interfaces/classes, ADDRESS, TRACE, imports, linking, and packaging.
Level B/G split
Publish a short design note explaining what Level B owns and what Level G owns. The Release 1 wording should say: Level B is stable; Level G has an implemented initial task/parallel surface and library overlay, not a full stable language contract.
Core UTF contract
Keep .string as valid UTF-8 and .binary as arbitrary bytes. Complete the
Release 1 docs and tests around boundaries. Deprecate compiler/plugin-owned
Unicode semantics in favor of VM codepoint validity plus Level G Unicode
libraries.
Plugin policy
Classify plugin directories and update CMake/package defaults to make the
release surface obvious. Core algorithms should move to Rexx libraries where
practical; tight runtime integration should move to VM/RXAS instructions;
plugins should mainly represent external integration, OS/application
boundaries, or experimental/edge capabilities. Include native-backed Rexx
adapter modules and tests in this triage, not just C plugin directories.
For beta 3, Id, KeyDB, and Os are restored as plugin-backed classlib
adapters in the separate classlib_native.rxbin image with focused tests
and explicit plugin dependencies. They are not part of core
classlib.rxbin, so RexxScript and other pure-classlib consumers do not
inherit unrelated native plugin requirements. Any later change to make them
core, optional, deprecated, experimental, or removed should be explicit
rather than caused by refactoring fallout.
Runtime lookup and late loading
The beta 3 WIP baseline now has explicit-file late-load/relink coverage and sorted interface method/factory registries. Exact method dispatch uses a binary search; factory selection binary-searches the interface/member bucket and scans only matching providers. Runtime loading rebuilds both indexes. Cross-platform validation remains part of Release 1 QA.
Large constant foundation
Immutable binary constants, typed binary-memory access, and packed jump tables provide the Release 1 minimum needed by current demos and compiler lowering. Dedicated immutable integer/string arrays, typed records, and broader source sugar are explicitly deferred; they can be represented in binary memory until a later design justifies separate forms.
The scalar .int contract is signed 64-bit on every supported Release 1
desktop build. The shared ABI typedef, parser boundaries, checked arithmetic,
compiler folding, RXAS literal handling, and VM limits are covered together;
legacy 32-bit-host validation remains separate platform work.
Performance baseline and targeted improvements
Establish performance baselines before changes. Ship only measured or strongly justified RXAS/rxc optimizer improvements. Use the existing inlining gate inventory to choose small, valuable optimizer slices.
Demos, tutorials, and docs
Ship curated Level B, Level G, Level L, and Level C demos with expected commands and outputs. Complete final docs in the last sprint.
Packaging status discipline
For beta 3, package only formats whose build, signing, upload, and smoke checks are reliable by the beta 3 foundation target. Keep portable ZIPs as the fallback for every platform and document any installer gaps clearly.
Should-ship items are important but have explicit fallback paths.
Perfect-hash select
The RXAS packed-table surface, linear/open-hash/ACPH algorithms, measured
auto policy, VM execution, disassembly round trip, corruption handling,
and conservative rxc integer/string/binary lowering are implemented on
develop for beta 3 WIP. Remaining Release 1 work is cross-platform QA
and documentation/release review; arbitrary RXAS branch-ladder recognition
is explicitly post-Release 1 CFG/dataflow work.
First Level G library version
The development baseline now combines the existing LLM work with initial structured concurrency and a bounded HTTP client/server over one private protocol backend. Complete portable conformance and make the publication decision; richer Unicode remains planned. Fallback: keep concurrency explicitly initial and ship only the Level G pieces with sufficient platform and package evidence.
Initial Level C canonical-AST lowering proof
Try for a small compiled Classic Rexx lowering slice by transforming the
Level C parse/AST shape into the canonical compiler AST shape. Candidate
source forms include variables, SAY, IF, simple DO, ARG, and
string-literal ADDRESS, but the approved beta 3 slice should be smaller if
needed. Fallback: ship DSLSH/highlighter as the Release 1 Level C milestone
and publish the lowering plan as the next phase.
Level L lexer/parser demo
Use large constants and optimized lookup if available. The first
rxfnsl.tinyexpr slice is a generated-output proof: it is hand-written in
the shape a future lexer/parser generator might emit, using packed binary
tables, exposed token/layout constants, and token records. The real
generator remains later work; this slice should guide whether to port re2c
or change a generator backend to emit cRexx/RXAS directly. Fallback: keep
the generated-shape demo and document performance work.
Plugin/demo cleanup
Clean enough that users can tell core from optional. Fallback: docs and CMake options clarify status even if all source directories are not moved.
Windows installer user experience for beta 3
Add a signed NSIS setup.exe from the signed Windows payload if the local
signing flow can build, sign, upload, and verify it reliably before the beta
3 tag. Fallback: keep the signed Windows ZIP as the supported Windows asset
and document manual PATH setup.
Linux package hardening
Keep the .deb path, but add install/uninstall smoke testing and dependency
metadata review before treating it as more than a prototype. Fallback: ZIP
remains the portable Linux asset and .deb remains dev-snapshot-only.
These should not block Release 1. Initial identifies the first bounded concurrency surface without claiming stable compatibility; experimental keeps its existing meaning for unrelated research and prototype work.
The owner below is accountable for driving the work and keeping the issue honest. Ownership does not mean that person must implement every line.
Adrian:
Peter:
Rene:
Create these after the GitHub discussion is approved. Suggested labels assume a
common rel1 label plus the tier and area labels shown here.
| # | Candidate issue | Owner | Labels | Acceptance signal |
|---|---|---|---|---|
| 1 | Open beta 3 branch baseline after beta 2 tag | Rene | rel1, must, docs, release |
VERSION, README, release index, install docs, examples, security policy, and beta 3 release note identify develop as beta 3 WIP while preserving beta 2 as the latest completed tag. |
| 2 | Keep beta 3 release note aligned with Release 1 gates | Rene | rel1, must, docs |
Beta 3 note carries high-level scope, timetable, package expectations, known limitations, and explicit WIP status until the tag exists. |
| 3 | Define Release 1 scope tiers and final feature-freeze date | Adrian | rel1, must, planning |
GitHub discussion records tiers, dates, and fallback policy. |
| 4 | Lock Level B Release 1 language surface | Adrian | rel1, must, level-b, language |
Syntax and stable library surface are frozen or explicitly listed as exceptions by 2026-07-03. |
| 5 | Define Level B versus Level G language and library boundary | Adrian | rel1, must, level-b, level-g |
Short design note states what each level owns for Release 1. |
| 6 | Stabilize Level B core library API and iterator/reference contracts | Rene | rel1, must, library, tests |
Public API names, examples, and focused tests agree. |
| 7 | Complete Unicode/text semantics issue #583 for Level B | Adrian | rel1, must, unicode, level-b |
.string, .binary, conversion, comparison, and BIF behaviour are documented and tested. |
| 8 | Normalize tool output path behaviour issue #584 | Adrian | rel1, must, toolchain |
rxc, rxas, and driver workflows have consistent -o behaviour and tests. |
| 9 | Complete RXAS float precision coverage issue #585 | Rene | rel1, must, rxas, tests |
Regression coverage distinguishes stored binary64 precision from display formatting. |
| 10 | Complete RXAS instruction coverage issue #586 | Rene | rel1, must, rxas, tests |
Instruction inventory and regression coverage are updated. |
| 11 | Retire/deprecate compiler-owned Unicode plugin path | Adrian | rel1, must, unicode, plugins |
Obsolete path is removed, disabled, or documented as deprecated with replacement guidance. |
| 12 | Inventory and classify all plugins and native-backed adapters as core, integration, optional, deprecated, or experimental | Peter | rel1, must, plugins |
Classification table exists and matches build/package defaults, including the current classlib_native.rxbin adapters Id, KeyDB, and Os and any explicit decision to keep them separate, promote them to core, or move them elsewhere. |
| 13 | Change default plugin build/package set to match Release 1 policy | Peter | rel1, must, plugins, packaging |
Default build makes the release surface clear; optional legacy paths are opt-in. |
| 14 | Harden METALOADMODULE late load and class/interface rebinding |
Adrian | rel1, must, vm, classes |
Implemented for beta 3 WIP with explicit-file late-load tests through rxvm, rxbvm, and the crexx driver; cross-platform QA remains. |
| 15 | Replace interface method/factory linear scans with indexed lookup | Adrian | rel1, must, vm, performance |
Implemented for beta 3 WIP with sorted indexes, late-load rebuilding, focused semantics tests, and a measured benchmark. |
| 16 | Provide fast structured-data lookup without register-attribute metadata indexes | Adrian | rel1, must, vm, compiler |
Superseded by byte-addressed binary memory, zero-copy comparison, packed jump tables, and compiler lowering; typed memory structs remain post-Release 1. |
| 17 | Add large immutable constant structures to RXAS/RXBIN/VM | Adrian | rel1, must, vm, rxas |
Release 1 minimum is implemented through binary constants and packed tables; dedicated typed arrays/records are deferred. |
| 18 | Expose large constant structures through rxc for lexer/parser use | Adrian | rel1, must, compiler, level-l |
Compiler can emit the minimum constant tables needed by approved demos, or surface syntax is deferred with VM/RXAS support documented. |
| 19 | Add performance benchmark baseline for Release 1 | Rene | rel1, must, performance, tests |
Linux ARM64 and native macOS ARM64 baselines are recorded with repeatable serial sampling. The four-slice dispatch refactor is implemented and locally validated on macOS ARM64, including the coherent frame cache and separate computed-goto runtime instruction image. Native Linux x86-64 counters, Windows x86-64 validation, and the cross-platform pipeline remain external gates before a default-VM or compiler-policy decision. |
| 20 | Run final demo/tutorial usability pass | Rene | rel1, must, docs, qa |
Curated examples have commands, expected output, and manual pass/fail notes. |
| 21 | Run final packaging/signing/notarization validation | Rene | rel1, must, packaging, qa |
Release assets, signing status, and platform package notes are verified before publishing. |
| 22 | Publish Release 1 known limitations | Rene | rel1, must, docs, release |
Known limitations are in release notes and match the shipped feature set. |
| # | Candidate issue | Owner | Labels | Fallback |
|---|---|---|---|---|
| 23 | Decide and implement Level G Unicode baseline | Adrian | rel1, should, level-g, unicode |
Ship LLM-focused Level G and document Unicode as planned if utf8proc or API design is not settled. |
| 24 | Add build-time perfect hash optimization for static select |
Adrian | rel1, should, compiler, performance |
Implemented for the conservative eligible integer/string/binary cases; arbitrary ladder recognition remains post-Release 1. |
| 25 | Add RXAS/VM lookup primitives needed by perfect-hash select | Adrian | rel1, should, rxas, vm |
Implemented through packed jump tables with linear, open-hash, ACPH, and measured auto selection. |
| 26 | Add Level L lexer/parser library demo | Peter | rel1, should, level-l, demos |
Ship the generated-output proof using packed binary tables and document generator work as later. |
| 27 | Define Level G first library baseline | Rene | rel1, should, level-g, library |
The development baseline now documents LLM, structured concurrency and concurrent HTTP; complete portable evidence and explicitly decide which pieces are published. |
| 28 | Add Level G tutorial and demos | Rene | rel1, should, level-g, docs |
Checked task, parallel-block, typed-transfer and concurrent-HTTP examples now exist; complete the final usability and platform pass. |
| 29 | Define initial Level C Release 1 milestone | Adrian | rel1, should, level-c, planning |
Ship parser/highlighter milestone plus canonical-AST lowering plan. |
| 30 | Implement first Level C canonical-AST lowering/execution proof if approved | Adrian | rel1, should, level-c, compiler |
Keep normal Level C compilation unsupported and document the next phase. |
| 31 | Establish lib/rxfnsc as the initial shared Level C/RexxScript runtime foundation |
Adrian | rel1, should, level-c, library |
Keep the current scalar/stem/pool runtime surface small and document later BIF/lowering work. |
| 32 | Add Level C demo and known-limits documentation | Peter | rel1, should, level-c, docs |
Ship DSLSH/highlighter demo with explicit no-compile limitation. |
| 33 | Define RexxScript beta 3 integration slice | Adrian | rel1, should, rexxscript, planning |
RexxScript is documented as an interpreted strings-only modern Rexx surface, not the Level C compiler path. |
| 34 | Curate shared Rexx BIF surface for RexxScript and Level C | Rene | rel1, should, bifs, level-c, rexxscript |
First BIF list separates string-first RexxScript use from Classic value/pool needs. |
| 35 | Add RXAS peephole optimizer improvements from measured cases | Rene | rel1, should, rxas, performance |
Keep baseline optimizer and publish benchmark results. |
| 36 | Add rxc optimizer/inlining improvements from current fail-closed gates | Rene | rel1, should, compiler, performance |
Keep gates fail-closed and document deferred cases. |
| 37 | Clean up plugin demos and separate core from non-core examples | Peter | rel1, should, plugins, demos |
Clarify status in docs/CMake even if directories are not moved. |
| # | Candidate issue | Owner | Labels | Fallback |
|---|---|---|---|---|
| 38 | Add Level L syntax-sugar demo if syntax is approved | Adrian | rel1, experimental, level-l |
Keep Level L demo library-only for Release 1. |
| 39 | Add GPU VM plugin proof of concept behind experimental status | Adrian | rel1, experimental, vm, plugins |
Publish design notes or keep the work out of the release branch. |
| 40 | Qualify and decide publication of structured concurrency | Adrian | rel1, initial, vm |
Local/process tasks and ownership-safe transfer are implemented; keep the surface initial unless portable conformance, package proof and release approval complete. Shared-memory subtasks remain out of scope. |
| 41 | Design class and interface constants for Release 2 | Adrian | r2, level-b, classes, compiler |
Keep Release 1 constants procedure-scoped; investigate whether constants should have a public view as part of the R2 class/interface constant design. |
| 42 | Replace file RXAS instructions with a measured typed rx_io call surface |
Adrian | post-r1, rxas, vm, library, performance |
Preserve current opcodes and context-owned behavior unless an approved design proves exact ownership/error equivalence, representative performance, dual lowering or migration, packaging, both VMs and the selected RXBIN tombstone policy. Transferred from former RCC-6. |
| 43 | Review remaining host-shaped RXAS instruction families using measured dispositions | Adrian | post-r1, rxas, vm, performance, compatibility |
Keep the current instructions unless separate FNV-1a, clock/environment/version/random, socket and reflection reviews justify typed-call conversion with use, ownership, size, performance and cross-platform evidence. Transferred from former RCC-7. |
Decisions needed before implementation:
select perfect-hash semantics, fallback behaviour, and supported types.Technical dependencies:
select depends on static-case detection, constant table
emission, VM/RXAS lookup support or branch-sequence generation, and fallback.TINY_TOK_*, and binary memory structs are
Release 2 candidates.utf8proc
or a Rexx-first alternative.Documentation dependencies:
docs/releases, security policy, examples, install docs, and language
reference aligned on beta 3 WIP versus completed beta 2 status.docs/ai-context/CREXX_LIBS.md should describe rxfnsc as the Level
C/RexxScript runtime foundation now that the library directory exists.The final sprint is reserved for:
Feature work that misses the 2026-08-14 gate should move to post-Release 1 unless it fixes a must-ship defect.