Skip to main content

Protocol specifications as Python code

Project description

Wunderspec

Wunderspec

PyPI Lint Build Run Examples Convert to TLA+

Wunderspec is a Python DSL for writing and checking executable specifications.

Distributed systems often fail due to unforeseen issues: message reordering, race condition, stale observations, retry behavior, crashes and restarts, network outages, vibe code. Adding more example tests is often not enough to find these bugs before they make it to production. Specifications written in Wunderspec surface these issues early, so that teams find design flaws before they become production incidents.

This is the open-core distribution.

:clipboard: Wunderspec in 5 minutes: the Wunderspec in Five Minutes gives you a quick overview of the core concepts.

:clipboard: Cheatsheet: the Wunderspec cheatsheet summarizes the DSL and CLI in a few pages — keep it open while you work.

:bulb: Using Quint? Try this command:

uv tool install wunderspec
wunderspec convert --from=spec.qnt --to=spec.py --main=main
Wunderspec Flower

1. Wunderspec in Action

Follow Bob in his Wunderspec adventure. There, Bob writes a specification of a write-ahead log, finds a bug, replays the counterexample and fixes the specification.

2. Installation

Using uv:

uv tool install wunderspec

After installation, the CLI is available:

wunderspec --help

If you want to add Wunderspec as a dependency, just type:

uv add wunderspec
uv sync

3. Features

This open-core package includes the features marked ✅ in the Open Core column. Premium-only command names stay visible for discoverability, but those commands are not included in this package.

Feature Open Core Premium
Symbolic expression evaluator
wunderspec lint
wunderspec run
wunderspec replay
wunderspec convert
wunderspec check
wunderspec with-tlc
wunderspec with-apalache
wunderspec fuzz
wunderspec rust
wunderspec lean

4. Release Provenance

  • Release tag: v0.136.1
  • Source commit: 6ef37ade3f08676708e0127d20ba14e313abbbb2

See tests/README.md for the development test log captured at release time.

5. Latest Release Notes

Changes since public release v0.134.1.

  • Add --coverage NAME to wunderspec with-apalache, passing the generated TLA+ operator for the selected @coverage function as --view=<Oper> for check and simulate.
  • Allow wunderspec with-apalache --max-steps 0 to check initial states.
  • Write Apalache output to an apalache.log file while it runs, report the log path, and add --verbose to stream the log to the terminal immediately.
  • Require default=... for collection-form Max and Min, e.g. Max(s, default=0). The default is the reduce seed, so empty collections no longer need a separate size guard or CHOOSE-based seed.
  • Render collection-form Max and Min reducers as TLAPS-friendly CHOOSE expressions in generated TLA+ while keeping reducer-based interpreter evaluation.
  • Add TLA+ labels to wunderspec convert output for @invariant and @example operators, including nested predicate calls by default. Use @invariant(inline=True) or @example(inline=True) to inline nested predicate calls instead.
  • Preserve definition docstrings when converting Wunderspec to TLA+ by emitting them as \* comments immediately before the generated operator definitions.
  • Allow generator-form Forall, Exists, SetIf, Set, and Map calls to pass name= for readable TLA+ binder names while preserving internal unique binder identities.
  • Short-circuit interpreter evaluation of Implies(False, rhs), so the right side is not evaluated when the antecedent is false.
  • Add Max and Min builtins. They take either several integers (Max(a, b, c)) or a single set or list of integers (Max(s)). Both are syntactic sugar — the multi-argument form expands to nested Ite and the collection form folds with reduce — so they work in the interpreter, TLC, and Apalache. Max(s)/Min(s) over an empty collection are undefined and raise, mirroring CHOOSE over an empty set; guard with Ite(s.size == 0, default, Max(s)) when you need a fallback.

6. License

Wunderspec is distributed under the Functional Source License, Version 1.1, with an Apache 2.0 future license (FSL-1.1-ALv2). See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wunderspec-0.136.1.tar.gz (4.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wunderspec-0.136.1-py3-none-any.whl (270.1 kB view details)

Uploaded Python 3

File details

Details for the file wunderspec-0.136.1.tar.gz.

File metadata

  • Download URL: wunderspec-0.136.1.tar.gz
  • Upload date:
  • Size: 4.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wunderspec-0.136.1.tar.gz
Algorithm Hash digest
SHA256 f30980b5bbe619269ad9f387526c87d127c8c56047812dfdca0cc74cf5b6cae3
MD5 6053040eb611c5cf69865ab5c3bcc087
BLAKE2b-256 97d4b43eecc40945980d485bf72ba7a5a23dd275cb61704730cc94259b3ac968

See more details on using hashes here.

Provenance

The following attestation bundles were made for wunderspec-0.136.1.tar.gz:

Publisher: publish.yml on wunderspec/wunderspec

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file wunderspec-0.136.1-py3-none-any.whl.

File metadata

  • Download URL: wunderspec-0.136.1-py3-none-any.whl
  • Upload date:
  • Size: 270.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wunderspec-0.136.1-py3-none-any.whl
Algorithm Hash digest
SHA256 9ca7b9718964a0adf794eda4cbc19a017a1893e647c98c8deb4bcd1edd1916c7
MD5 9b5f6ee7d6b7f4a9b1c3f717016ed427
BLAKE2b-256 33267c1c03d65676064446fc506d6ee9d994bb38739b8df13e0c40263d216897

See more details on using hashes here.

Provenance

The following attestation bundles were made for wunderspec-0.136.1-py3-none-any.whl:

Publisher: publish.yml on wunderspec/wunderspec

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page