PackageTrack
Sign in Get early access

stateright

A model checker for implementing distributed systems.

0.31.0 14M downloads/mo #2532 most downloaded on crates.io stateright/stateright

What this package is like to depend on

Last release 1 years ago

27 Jul 2025

Release timing varies

gaps range from 9 days to 1.2 years

Some releases are documented

notes for 11 of 44 stable releases

8 versions withdrawn

withdrawn after publishing

8 years old

52 releases · first in 2018

0 releases in the last 12 months

see the full history below

Release timeline

52 releases · Jul 2018 to Jul 2025
2019 2020 2021 2022 2023 2024 2025 2026
Release Pre-release Withdrawn

Releases

latest 52
  1. 0.31.0 27 Jul 2025
    Release notes

    Andrew Jeffery [email protected]

    • Simplify how checker waits for shutdown.
    • Panic on property name collision.

    cjen1 [email protected]

    • Fix bug in eventually property checker.

    Jonathan Nadal [email protected]

    • Address nondeterministic test.

    Liangrun Da [email protected]

    • Add Raft protocol example.

    Maurice Lam [email protected]

    • Add support for random selection.
    • Add an example of a last writer wins register demonstrating random selection.

    Peiyang He [email protected]

    • Adding missing fields to ActorModelState equality/serialization and correct field name typo.
    • Correct typos in docs.
    • Add support for actor recovery and storage.
    • Fix bug in Explorer.
    • Update Explorer to use action index rather than state digests to reference a behavior, making the URLs more stable.
    Open source →
  2. 0.30.2 03 Jun 2024
    Release notes

    Andrew Jeffery [email protected]

    • Add ability to define when checking finishes via HasDiscoveries.
    • Add optional checker timeout.

    D. Reusche [email protected]

    • Add interaction.rs example.

    Liangrun Da [email protected]

    • Fix handling of non-unique states for unordered duplicating networks.
    Open source →
  3. 0.30.1 27 Aug 2023
    Release notes

    Andrew Jeffery [email protected]

    • Cleanly handle panics during model checking.
    • Leverage tiny_http for Explorer.
    • Print fingerprint path for discoveries in default report.
    • Add names to actors and show in Explorer.
    • Introduce simulation checker.

    Jonathan Nadal [email protected]

    • Fix unintentional spin-wait loop in real-world runtime (spawn).
    • Fix nondeterministic test result.

    remzi [email protected]

    • Simplify DGraph (used by tests) by eliminating unnecessary cloning.
    Open source →
  4. 0.30.0 28 May 2023
    Release notes

    Notable changes follow, grouped by author.

    Andrea Stedile [email protected]

    • Support crash failures.

    Andrew Jeffery [email protected]

    • Enhance how properties are displayed in the Explorer UI.
    • Introduce an "on-demand" checker for Explorer.
    • Introduce depth tracking and max depth checking.
    • Introduce named timers.
    • Sort discoveries.
    • Introduce a join_and_report method to reduce time overestimation.

    David Rusu [email protected]

    • Fix a bug in the new on-demand checker.

    Jonathan Nadal [email protected]

    • Address a bug for ordered network checking that would result in not exploring the complete state space. Thank you to Andrea Stedile for identifying this problem.

    Wink Saville [email protected]

    • Improve tcpdump usage details in the examples.
    Open source →
  5. 0.29.0 19 Mar 2022
    Release notes

    This release adds support for symmetry reduction, courtesy of Chris Jensen (@Cjen1 on GitHub). It also introduces the ability to choose network semantics, which can be helpful for reducing the state space. Options are: ordered, unordered duplicating, and unordered non-duplicating. DuplicatingNetwork was removed in favor of capturing that aspect via the new Network type, enabling the library to leverage the most efficient data structure for each particular use case.

    Open source →
  6. 0.28.0 22 May 2021
    Release notes

    Stateright now distinguishes between the number of states (including regenerated) and the number of unique states. To facilitate this, Checker::generated_count has been removed in favor of state_count and unique_state_count methods.

    Open source →
  7. 0.27.1 11 May 2021
    Release notes

    This release introduces the ability to quickly navigate forward/backward along a path using down/up or j/k.

    Open source →
  8. 0.27.0 09 May 2021
    Release notes

    This release introduces multiple enhancements for Stateright Explorer. Explorer now shows ignored actions. It also has labels for previous/next states that match the current state. Arguably the biggest improvement is that Explorer now shows all properties (not just properties with discoveries) and explains the checker outcomes for each property. There are also some minor styling changes in the UI.

    Another small improvement is that ActorModel now overrides rendering of the Deliver action with a more concise/intuitive representation.

    While preparing an example for a revised screenshot, I accidentally created a model with unwanted nondeterminism: my model depended on iteration order, which in turn depended upon a random seed. Root causing took a long time, so I improved the error message that shows when the checker detects unwanted nondetermism to make similar mistakes easier to debug in the future.

    Open source →
  9. 0.26.1 01 May 2021
    Release notes

    This release introduces a PathRecorder visitor and a VectorClock utility type. It also adds an Actor implementation for Vec<(Id, Msg)> for any message type Msg, which can be used as a simple client actor for exercising a system.

    Open source →
  10. 0.26.0 05 Apr 2021
    Release notes

    RegisterActor::Client now has a put_count field that indicates how many RegisterMsg::Puts to perform before issuing a RegisterMsg::Get.

    Open source →
  11. 0.25.0 03 Apr 2021
    Release notes

    I was recently asked where linearizability was specified in the actor examples. The answer was RegisterCfg::into_model, but this question provided useful feedback: the existing structure was hiding information important for understanding each model.

    This release addresses that gap by removing RegisterCfg. Instead the actor examples fully specify their ActorModels. This requirement is made less verbose by introducing two helpers, RegisterMsg::record_invocations and RegisterMsg::record_returns.

    Here is a representative example prior to this release:

    RegisterCfg {
            client_count: 2,
    		servers: vec![
    			PaxosActor { peer_ids: model_peers(0, 3) },
    			PaxosActor { peer_ids: model_peers(1, 3) },
    			PaxosActor { peer_ids: model_peers(2, 3) },
    		],
        }
        .into_model()
        .duplicating_network(DuplicatingNetwork::No)
        .within_boundary(within_boundary)
        .checker()
    

    As mentioned above, RegisterCfg::into_model was implemented inside the library, thereby inadvertantly hiding important details about the resulting model. Furthermore, within_boundary lacked access to sufficient configuration:

    fn within_boundary<H>(
        _: &RegisterCfg<PaxosActor>,
        state: &ActorModelState<RegisterActor<PaxosActor>, H>)
        -> bool
    {
        state.actor_states.iter().all(|s| {
            if let RegisterActorState::Server(s) = &**s {
                s.ballot.0 <= 3
            } else {
                true
            }
        })
    }
    

    The new pattern is to introduce a model-specific configuration type, which has the added benefit of enabling additional model-specific parameters:

    PaxosModelCfg {
            client_count: 2,
            server_count: 3,
            max_round: 3,
        }
        .into_model().checker()
    

    The same program would then specify a dedicated into_model, thereby addressing the motivating question of this release. For example:

    impl PaxosModelCfg {
        fn into_model(self) ->
            ActorModel<
                RegisterActor<PaxosActor>,
                Self,
                LinearizabilityTester<Id, Register<Value>>>
        {
            ActorModel::new(
                    self.clone(),
                    LinearizabilityTester::new(Register(Value::default()))
                )
                .actors((0..self.server_count)
                        .map(|i| RegisterActor::Server(PaxosActor {
                            peer_ids: model_peers(i, self.server_count),
                        })))
                .actors((0..self.client_count)
                        .map(|_| RegisterActor::Client {
                            server_count: self.server_count,
                        }))
                .duplicating_network(DuplicatingNetwork::No)
                .property(Expectation::Always, "linearizable", |_, state| {
                    state.history.serialized_history().is_some()
                })
                .property(Expectation::Sometimes, "value chosen", |_, state| {
                    for env in &state.network {
                        if let RegisterMsg::GetOk(_req_id, value) = env.msg {
                            if value != Value::default() { return true; }
                        }
                    }
                    false
                })
                .record_msg_in(RegisterMsg::record_returns)
                .record_msg_out(RegisterMsg::record_invocations)
                .within_boundary(|cfg, state| {
                    state.actor_states.iter().all(|s| {
                        if let RegisterActorState::Server(s) = &**s {
                            s.ballot.0 <= cfg.max_round
                        } else {
                            true
                        }
                    })
                })
        }
    }
    

    The release also introduces a supporting ConsistencyTester trait generalizing LinearizabilityTester and SequentialConsistencyTester. This new trait enables helpers (such as RegisterMsg::record_invocations) to be used with models expecting linearizability, sequential consistency, or other to-be-added consistency semantics.

    Open source →
  12. 0.24.1 30 Mar 2021

    Nothing published for this version

  13. 0.24.0 30 Mar 2021

    Nothing published for this version

  14. 0.23.3 29 Mar 2021

    Nothing published for this version

  15. 0.23.2 17 Mar 2021

    Nothing published for this version

  16. 0.23.1 08 Mar 2021

    Nothing published for this version

  17. 0.23.0 22 Feb 2021

    Nothing published for this version

  18. 0.22.3 13 Feb 2021

    Nothing published for this version

  19. 0.22.2 07 Feb 2021

    Nothing published for this version

  20. 0.22.1 19 Jan 2021

    Nothing published for this version

  21. 0.22.0 16 Jan 2021

    Nothing published for this version

  22. 0.21.0 11 Jan 2021

    Nothing published for this version

  23. 0.20.1 02 Jan 2021

    Nothing published for this version

  24. 0.20.0 18 Dec 2020

    Nothing published for this version

  25. 0.19.0 12 Dec 2020

    Nothing published for this version

  26. 0.18.3 06 Dec 2020

    Nothing published for this version

  27. 0.18.2 05 Dec 2020

    Nothing published for this version

  28. 0.18.1 01 Dec 2020

    Nothing published for this version

  29. 0.18.0 23 Nov 2020

    Nothing published for this version

  30. 0.17.0 28 Sep 2020

    Nothing published for this version

  31. 0.16.0 28 Sep 2020

    Nothing published for this version

  32. 0.15.0 20 Sep 2020

    Nothing published for this version

  33. 0.14.0 14 Sep 2020

    Nothing published for this version

  34. 0.13.1 30 Aug 2020

    Nothing published for this version

  35. 0.13.0 05 Aug 2020

    Nothing published for this version

  36. 0.12.0 04 Aug 2020

    Nothing published for this version

  37. 0.11.2 27 Jul 2020

    Nothing published for this version

  38. 0.11.1 27 Jul 2020

    Nothing published for this version

  39. 0.11.0 27 Jul 2020

    Nothing published for this version

  40. 0.10.1 11 Jul 2020

    Nothing published for this version

  41. 0.10.0 11 Jul 2020

    Nothing published for this version

  42. 0.9.1 06 Jul 2020 withdrawn

    Nothing published for this version

  43. 0.9.0 21 Jun 2020

    Nothing published for this version

  44. 0.8.0 08 Jun 2020

    Nothing published for this version

  45. 0.7.0 02 Jun 2020 withdrawn

    Nothing published for this version

  46. 0.6.0 31 May 2020 withdrawn

    Nothing published for this version

  47. 0.5.0 02 Feb 2020 withdrawn

    Nothing published for this version

  48. 0.4.0 05 Jan 2020

    Nothing published for this version

  49. 0.3.0 23 Jun 2019 withdrawn

    Nothing published for this version

  50. 0.2.0 13 Nov 2018 withdrawn

    Nothing published for this version

  51. 0.1.0 06 Aug 2018 withdrawn

    Nothing published for this version

  52. 0.0.0 12 Jul 2018 withdrawn

    Nothing published for this version

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive