Releases: fabracht/tla-rs
Releases · fabracht/tla-rs
v0.3.11
[0.3.11] - 2026-05-02
Fixed
- Parser auto-detection for
Init/Next/ invariant names no longer misclassifies parameterized helpers. Operators likeInvokeAction(p),InitNode(k), orNextStep(n)were being treated as the spec's Init/Next or as invariants and evaluated with their parameters unbound, causingundefined variableerrors at state 0. Fix gates all three classifications onparams.is_none()(#35)
Added
test_cases/should_pass/FRList.tla— Fomitchev–Ruppert lock-free linked list, structural correctness (paper Inv 1–5 plus three derived invariants), with auto-loadedFRList.cfgand oracle testtest_cases/should_pass/FRListLin.tla— adds a per-process operation layer with an abstract dictionary, checks the refinement invariantdict = RegularKeysplus per-op response validity, with auto-loadedFRListLin.cfgand oracle testtest_cases/should_pass/parameterized_inv_prefix.tla— regression test locking in the auto-detection fix
v0.3.9
Changelog
[0.3.9] - 2026-04-08
Added
- CI jobs
clippy-wasm,test-wasm, andbuild-wasm32exercising thewasmfeature on host and the realwasm32-unknown-unknowntarget - Host-runnable tests covering every
CheckResultandPrepareSpecErrorvariant exposed through the wasm bindings
Changed
- Internal consolidation of
src/wasm.rs: all fourwasm_bindgenentry points now flow through a singlecheck_internalhelper, with sharedWasmCheckResultconstructors for theCheckResult → JSONmapping (no public API change) prepare_specandCheckerConfig::spec_pathare now compiled onwasm32-unknown-unknown, fixing the previously broken target build
[0.3.8] - 2026-04-07
Fixed
- Variant names in wasm.rs (
CheckResultarm names matched against wrong string literals) - Clippy
missing_const_for_thread_localwarning onRNGthread-local
[0.3.7] - 2026-04-03
Fixed
..(range) operator not recognized in recursive function domains (f[i \in 1..N]) and CHOOSE domains (CHOOSE x \in 1..N : P)- INSTANCE/EXTENDS resolution in interactive mode
- Finding initial states through static instance references (e.g.,
Init == MyInstance!Init /\ ...)
Added
- Practical TLA+ user guide with paired specs for writing actions patterns
[0.3.6] - 2026-03-23
Fixed
- IF expressions with bulleted conjunction lists as conditions (
IF /\ cond1 /\ cond2 THEN) - IF conditions with multi-line inline conjunctions where
/\is outdented relative to the first operand - Leading
/\in IF THEN/ELSE branches (e.g.,THEN /\ expr1 /\ expr2) - Nested EXCEPT updates through records inside functions (
[f EXCEPT ![key].field = val])
[0.3.5] - 2026-03-22
Fixed
contains_prime_refinfinite recursion when analyzingRECURSIVEoperator bodies, causing the checker to hang on any spec using recursive operators inside Next actions
[0.3.4] - 2026-03-08
Fixed
SPECIFICATIONcfg directive extracting only the first init conjunct, producing 0 initial states for multi-variable specs
[0.3.3] - 2026-02-25
Added
- WASM build pipeline with clean,
package.jsongeneration, and npm packaging wasm-publishtask for npm publishing
Fixed
- Inline
\/operators within bulleted disjunction lists (e.g.,\/ A \/ B \/ Con one line) SPECIFICATIONcfg directive failing to find definitions ending withSpec- Nested bulleted
\/lists inside parentheses now useparse_and_itemfor correct inline handling
[0.3.2] - 2026-02-16
Fixed
(unnamed)action labels in counterexample traces
Added
counterexample_actions_alignmenttest case.cfgfiles for specs that need constants
[0.3.1] - 2026-02-14
Added
--dot-modeflag with four DOT export modes:clean(default),full,trace,choicesDotExportcontext struct for cleanerexport_dotAPI- WASM
dot_modeoption incheck_spec_with_options
Changed
- Default DOT export changed from full (all edges) to clean (no self-loops, parallel edges merged)
export_dotnow takes aDotExportstruct instead of individual parameters
[0.3.0] - 2026-02-13
Added
- TLC-compatible
.cfgfile parser with auto-discovery (Spec.cfgnext toSpec.tla) - Supported directives: INIT, NEXT, SPECIFICATION, CONSTANT(S), INVARIANT(S), PROPERTY/PROPERTIES, SYMMETRY, CHECK_DEADLOCK
- WASM
check_spec_with_optionsAPI with unified options object - WASM
check_spec_with_cfgAPI for cfg file support - WASM unit tests
- Bench profile (
panic = "unwind",strip = false)
Changed
- Batch candidate inference across all variables in a single AST walk
- Replaced
EnvBTreeMap with Vec-backed struct (~15% speedup on model checking) - Extracted
substitution.rsfrommodules.rsfor expression substitution logic - Gated
ratatui/crosstermdependencies for non-WASM targets only CheckResult::NextErrorandInvariantErrornow carry DOT graph datado_exportrefactored to returnOption<String>for WASM compatibility
Fixed
- WASM constant/cfg precedence: JSON constants now correctly override cfg constants
- WASM
allow_deadlockflag now properly propagated toapply_config substitute_exprnow recurses into TLC builtins and Bag operationsEnv::removepreserves insertion order (changed fromswap_removetoremove)split_top_levelhandles escaped quotes and brace depth correctly
[0.2.0] - 2026-02-05
Added
- Parameterized INSTANCE declarations (
Alias(p) == INSTANCE M WITH ...) - Qualified calls to instance operators (
Alias!Op(args),Alias(v)!Op(args)) - Library module support (modules without Init/Next can be used as INSTANCE targets)
- Stdlib modules (Naturals, Sequences, TLC, etc.) work with
LOCAL INSTANCE UNCHANGED<<vars>>now expands tuple-valued definitions (e.g.,vars == <<x, y>>)
[0.1.1] - 2026-02-05
Fixed
- Eliminated all production
unwrap/expect/paniccalls in checker, SCC, interactive mode, module registry, and renderer - Fixed O(N^4) next-state enumeration for specs with top-level
\E(existential quantifier) — mutex.tla with 78 processes went from ~2 minutes to under 1 second
Changed
next_states_implnow resolves zero-argument definition references before dispatching toexpand_and_enumerateorenumerate_next
[0.1.0] - 2026-02-04
Initial public release.
Features
- Full TLA+ model checker with BFS state exploration
- Recursive descent parser for TLA+ specifications
- Interactive TUI mode (
--interactive) with state exploration, expand/collapse for grouped changes - Counterexample replay mode (
--replay) - Symmetry reduction (
--symmetry) - Liveness checking with fairness constraints and SCC algorithm (
--check-liveness) - Scenario exploration (
--scenario) - Parameter sweeps (
--sweep) - Property counting with depth-stratified breakdowns (
--count-satisfying) - Continue past violations to collect all counterexamples (
--continue) - DOT graph export (
--export-dot) - JSON output (
--json) - Counterexample trace export (
--trace-json,--save-counterexample) - WASM target support
Standard Library Modules
- Naturals, Integers, Reals
- Sequences (including
SortSeq,SelectSeq,Permutations) - FiniteSets
- Bags
- Bits (bitwise operators)
- TLC (PrintT, ToString, RandomElement, TLCGet, TLCSet, Assert)
Performance
- Vec-based state representation (replacing BTreeMap)
- Env caching and primed variable name caching in BFS loop
- Disjunct decomposition for next-state evaluation
- Release profile with LTO, single codegen unit, and symbol stripping (1.3M binary)
v0.3.7
Fixed
..(range) operator not recognized in recursive function domains (f[i \in 1..N]) and CHOOSE domains (CHOOSE x \in 1..N : P)- INSTANCE/EXTENDS resolution in interactive mode
- Finding initial states through static instance references (e.g.,
Init == MyInstance!Init /\ ...)
Added
- Practical TLA+ user guide with paired specs for writing actions patterns
v0.3.6
Fixed
- IF expressions with bulleted conjunction lists as conditions (
IF /\ cond1 /\ cond2 THEN) - IF conditions with multi-line inline conjunctions where
/\is outdented relative to the first operand - Leading
/\in IF THEN/ELSE branches (e.g.,THEN /\ expr1 /\ expr2) - Nested EXCEPT updates through records inside functions (
[f EXCEPT ![key].field = val])
v0.3.4
v0.3.3
Added
- WASM build pipeline with clean,
package.jsongeneration, and npm packaging wasm-publishtask for npm publishing
Fixed
- Inline
\/operators within bulleted disjunction lists (e.g.,\/ A \/ B \/ Con one line) SPECIFICATIONcfg directive failing to find definitions ending withSpec- Nested bulleted
\/lists inside parentheses now useparse_and_itemfor correct inline handling
v0.3.2
v0.3.1
Added
--dot-modeflag with four DOT export modes:clean(default),full,trace,choicesDotExportcontext struct for cleanerexport_dotAPI- WASM
dot_modeoption incheck_spec_with_options
Changed
- Default DOT export changed from full (all edges) to clean (no self-loops, parallel edges merged)
export_dotnow takes aDotExportstruct instead of individual parameters
v0.3.0
v0.2.0
Added
- Parameterized INSTANCE declarations (
Alias(p) == INSTANCE M WITH ...) - Qualified calls to instance operators (
Alias!Op(args),Alias(v)!Op(args)) - Library module support (modules without Init/Next can be used as INSTANCE targets)
- Stdlib modules (Naturals, Sequences, TLC, etc.) work with
LOCAL INSTANCE UNCHANGED<<vars>>now expands tuple-valued definitions (e.g.,vars == <<x, y>>)