Skip to main content

Deterministic Weiss Schwarz simulator with a Rust core and Python bindings.

Project description

Weiss Schwarz Simulator (Rust core + Python bindings)

CI Wheels Benchmarks Security Docs PyPI Changelog Last Commit

Deterministic, RL-first Weiss Schwarz simulation: Rust runs the hot loop, advances until a decision point, and exposes a fixed action space + mask (and legal action ids) for efficient batched training. Python gets a thin EnvPool wrapper for stepping many environments in parallel.


Why this exists

Weiss Schwarz has hidden information, branching, and timing windows. For RL you typically want:

  • Determinism: reproduce episodes from a seed and action sequence.
  • Few boundary crossings: avoid Python↔Rust overhead for micro-steps.
  • Stable action space: fixed-size actions with legality masking.
  • Introspectability: canonical action descriptions, replays, and event logs.

This repo is built around those constraints.


Highlights

  • Advance-until-decision loop: engine runs internally until a player must act.
  • Canonical legal actions: ActionDesc list is the single truth source.
  • Fixed action id space + mask: derived from canonical actions and versioned (ACTION_ENCODING_VERSION).
  • Legal action ids (fast): use ids to avoid Python-side mask scans in hot loops.
  • Fixed-length observations: int32 arrays, versioned (OBS_ENCODING_VERSION).
  • Multicore stepping: EnvPool uses Rayon; Python binding releases the GIL.
  • Replays: deterministic, versioned, optional event stream, public-safe sanitization when enabled.
  • Curriculum switches: gate rules/features for training curricula.

Each environment is deterministic given its seed and action sequence. Parallel batch stepping does not change outcomes because envs are fully isolated.


Automation & Benchmarks

  • CI runs on every push/PR: Rust fmt/clippy/tests + Python ruff/pytest.
  • Wheels build on pushes to main (artifacts), and tags v* publish to GitHub Releases + PyPI.
  • Benchmarks run on pushes to main; history + charts are published via GitHub Pages.
  • Docs are published to GitHub Pages on pushes to main.

Latest benchmark history and charts: https://victorwp288.github.io/weiss-schwarz-simulator/benchmarks

Rust API docs: https://victorwp288.github.io/weiss-schwarz-simulator/rustdoc/

Note: with only 1–2 benchmark runs, charts can look “empty” until more points exist.

Releases

Release automation is handled by Release Please. To ensure downstream workflows (like Wheels) run automatically when a release tag is created, configure a fine-grained PAT as RELEASE_PLEASE_TOKEN in GitHub Actions secrets; otherwise you can manually run the Wheels workflow for the release tag.

Benchmark Snapshot (main, top 12)

Last updated: 2026-02-04 08:56 UTC

Benchmark Time
rust/advance_until_decision 31245 ns/iter
rust/step_batch_64 15036 ns/iter
rust/step_batch_fast_256_priority_off 74182 ns/iter
rust/step_batch_fast_256_priority_on 67407 ns/iter
rust/legal_actions 12 ns/iter
rust/legal_actions_forced 12 ns/iter
rust/on_reverse_decision_frequency_on 1098 ns/iter
rust/on_reverse_decision_frequency_off 1094 ns/iter
rust/observation_encode 172 ns/iter
rust/observation_encode_forced 171 ns/iter
rust/mask_construction 407 ns/iter
rust/mask_construction_forced 408 ns/iter

Repo layout

  • weiss_core/: Rust simulator core (state machine, legality, encoding, replay, pool)
  • weiss_py/: PyO3 extension module (weiss_sim) exposing EnvPool
  • python/weiss_sim/: Python wrapper that re-exports the extension
  • python/tests/: pytest smoke tests + fixture card DB

Installation

Python (local build via maturin)

Prerequisites:

  • Python: ≥ 3.10
  • Rust toolchain: stable (cargo, rustc)
  • Bindings: built with PyO3 0.24 + numpy 0.24 (Rust side)

Install (editable):

python -m pip install -U pip
python -m pip install -U maturin
python -m pip install -e .

Note (macOS/PyO3): if you build wheels locally, prefer an explicit interpreter to avoid linking errors and unsupported system Pythons:

maturin build --release --manifest-path weiss_py/Cargo.toml --interpreter .venv/bin/python -o dist

Sanity check:

python -c "import weiss_sim; print(weiss_sim.__version__, weiss_sim.EnvPool)"

Rust (core only)

cargo build -p weiss_core
cargo test -p weiss_core

Quickstart (Python): step with a trivial policy

The environment exposes a fixed action space and an action mask. You can select any index where mask==1. For speed, use legal action ids instead of scanning the full mask.

from pathlib import Path
import numpy as np
import weiss_sim

fixture_dir = Path("python/tests/fixtures")
db_path = fixture_dir / "cards.wsdb"

pool = weiss_sim.EnvPool.new_rl_train(
    1,
    str(db_path),
    deck_lists=[[1] * 50, [2] * 50],
    deck_ids=[1, 2],
    max_decisions=200,
    max_ticks=10_000,
    seed=123,
    num_threads=None,  # set to an int to pin a dedicated Rayon pool
)

buf = weiss_sim.EnvPoolBuffers(pool)
buf.reset()

for _ in range(10):
    ids_flat, offsets = buf.legal_action_ids()
    start, end = int(offsets[0]), int(offsets[1])
    action = int(ids_flat[start])
    actions = np.array([action], dtype=np.uint32)
    buf.step(actions)

Debug print (very lightweight):

print(pool.render_ansi(env_index=0, perspective=0))

Examples:

python python/examples/sb3_maskable_ppo.py
python python/examples/cleanrl_maskable_ppo.py
python python/examples/bench_python_boundary.py --num-envs 256 --steps 5000 --mode both

Python API (what you get)

The extension module is weiss_sim and the package re-exports it as import weiss_sim.

weiss_sim.EnvPool

Constructors (classmethods):

EnvPool.new_rl_train(
    num_envs: int,
    db_path: str,
    deck_lists: list[list[int]],
    deck_ids: list[int] | None = None,
    max_decisions: int = 10_000,
    max_ticks: int = 100_000,
    seed: int = 0,
    reward_json: str | None = None,
    num_threads: int | None = None,
)

EnvPool.new_rl_eval(...)
EnvPool.new_debug(...)

Minimal RL stepping uses BatchOutMinimal:

out = weiss_sim.BatchOutMinimal(num_envs)
pool.reset_into(out)
pool.step_into(actions, out)

Core methods:

  • reset_into(out: BatchOutMinimal) -> None
  • reset_indices_into(indices: list[int], out: BatchOutMinimal) -> None
  • reset_done_into(done_mask: np.ndarray[bool], out: BatchOutMinimal) -> None
  • step_into(actions: np.ndarray[uint32], out: BatchOutMinimal) -> None
  • step_debug_into(actions: np.ndarray[uint32], out: BatchOutDebug) -> None
  • reset_debug_into(out: BatchOutDebug) -> None
  • reset_indices_debug_into(indices: list[int], out: BatchOutDebug) -> None
  • legal_action_ids_into(ids: np.ndarray[uint16], offsets: np.ndarray[uint32]) -> int
  • auto_reset_on_error_codes_into(engine_status: np.ndarray[uint8], out: BatchOutMinimal) -> int
  • engine_error_reset_count() -> int
  • reset_engine_error_reset_count() -> None

Debug helpers:

  • action_lookup_batch() -> list[list[dict | None]]
  • describe_action_ids(action_ids: list[int]) -> list[dict | None]
  • decision_info_batch() -> list[dict]
  • state_fingerprint_batch() -> np.ndarray[uint64]
  • events_fingerprint_batch() -> np.ndarray[uint64]
  • render_ansi(env_index: int, perspective: int) -> str

Convenience properties:

  • action_space: int
  • obs_len: int
  • num_envs: int

Python helper:

  • EnvPoolBuffers(pool) allocates persistent numpy buffers and exposes reset(), step(), and legal_action_ids().
  • reset_rl(pool) / step_rl(pool, actions) return a RlStep dataclass with named fields.
  • RlStepI16LegalIds is like RlStep but uses int16 observations and uint16 legal action IDs to save memory. The I16 name refers to the observation dtype; legal IDs are still unsigned. Use reset_rl_i16_legal_ids / step_rl_i16_legal_ids when you want compact 16-bit legal IDs, and use reset_rl / step_rl for the standard RlStep representation.
  • *_i16_legal_ids APIs require ACTION_SPACE_SIZE <= 65535 (fits in uint16) and raise ValueError if the action space exceeds that limit.
  • reset_rl_i16_legal_ids(pool) / step_rl_i16_legal_ids(pool, actions) return RlStepI16LegalIds.
  • step_rl_select_from_logits_i16_legal_ids(pool, logits) selects actions in Rust and returns (RlStepI16LegalIds, actions). logits must be a np.ndarray of float32 with shape (num_envs, action_space), and actions is a np.ndarray of uint32 with shape (num_envs,). Type hint example (requires from numpy.typing import NDArray and import numpy as np): step_rl_select_from_logits_i16_legal_ids(pool: EnvPool, logits: NDArray[np.float32]) -> tuple[RlStepI16LegalIds, NDArray[np.uint32]]
  • pass_action_id_for_decision_kind(decision_kind) returns PASS_ACTION_ID for convenience.

Encodings (stable + versioned)

Encodings are deterministic and explicitly versioned:

  • weiss_sim.OBS_ENCODING_VERSION (currently 1)
  • weiss_sim.ACTION_ENCODING_VERSION (currently 1)

Observation tensor

Observations are fixed-length int32 arrays. Query the current length via:

  • weiss_sim.OBS_LEN or pool.obs_len

Visibility modes (observation_visibility):

  • "public": opponent hidden zones are masked (filled with -1).
  • "full": opponent hidden zones are revealed.

The header includes active player, phase, decision kind/player, last action, attack context, and choice pagination metadata. After the per-player blocks (perspective player first), the encoder appends:

  • Reason bits: public-safe flags for phase/resource/target gating.
  • Reveal history: recent revealed card ids for the observing player.
  • Context bits: priority/choice/stack/encore context.

Exact layout is defined in weiss_core/src/encode.rs and versioned by OBS_ENCODING_VERSION.

Action space

Actions are fixed to ACTION_SPACE_SIZE (pool.action_space). Families include:

  • pass (contextual; PASS_ACTION_ID)
  • mulligan confirm / mulligan select
  • clock
  • main play character/event/climax, moves, activated abilities
  • attack / counter
  • choice select + pagination
  • level up / encore
  • trigger order
  • concede (only legal when allow_concede=true)

The legal-action mask is derived from the canonical ActionDesc list and mapped to ids in a versioned way (ACTION_ENCODING_VERSION).


Performance & throughput

Rust core is already extremely fast; Python-side overhead can dominate.

Practical performance tips:

  • Use into-buffer APIs (reset_into, step_into) with preallocated buffers.
  • Prefer legal action ids over mask scans in Python.
  • Pin num_threads if you want repeatable multicore behavior.

RL-safe defaults (recommended)

  • EnvPool.new_rl_train(...) for training and EnvPool.new_rl_eval(...) for eval.
  • observation_visibility = Public
  • enable_visibility_policies = true
  • allow_concede = false
  • priority_allow_pass = true
  • strict_priority_mode = false
  • enable_priority_windows = false unless you explicitly train with priority timing windows
  • Treat timeouts as truncations (bootstrap value)

If you need to deviate, document the assumption and update the PPO guide.


Replays (WSR1)

Replays are binary WSR1 files written via ReplayWriter and serialized with postcard.

What gets recorded:

  • Header: obs/action encoding versions, replay schema version, seed, starting player, deck ids, curriculum id, config hash
  • Body: action sequence, per-step metadata (actor/decision kind/flags), optional event stream, final snapshot (terminal + state hash)

Replay sampling can be enabled from Rust (EnvPool::enable_replay_sampling). The Python binding does not currently expose replay sampling toggles.

Tooling:

cargo run -p weiss_core --bin replay_dump -- path/to/episode_00000000.wsr

Card database (WSDB)

The simulator loads a binary card DB:

  • Magic: WSDB
  • Schema version: u32 little-endian (WSDB_SCHEMA_VERSION = 1)
  • Payload: postcard-encoded CardDb

Pack JSON → WSDB:

cargo run -p weiss_core --bin carddb_pack -- cards.json cards.wsdb

See weiss_core/src/db.rs for the CardStatic schema and supported ability templates.

Scraper + converter pipeline (full card set)

The full EN card set is produced by the scraper + converter pipeline:

  • Scrape: scraper/scrape.pyscraper/out/cards.jsonl
  • Convert: scraper/convert.pyscraper/out/cards.json + scraper/out/cards_raw.json
  • Pack: carddb_packscraper/out/cards.wsdb

Smoke check with Python:

PYTHONPATH=python python python/wsdb_smoke.py

Project status (implemented vs simplified)

This is a simulator core built for RL training and determinism first. Some rule systems are intentionally simplified or diverge from the physical game.

Examples of current intentional simplifications/deviations:

  • local priority/stack model; official check-timing/play-timing subtleties are not fully replicated
  • card text is limited to implemented AbilityTemplate variants (no free-form text engine)
  • trigger icon semantics are simplified :
    • Draw is mandatory (not optional “may”)
    • Shot resolves as immediate 1 damage (not delayed on cancel)
    • Bounce returns a character from your stage (not opponent’s)
  • deck-top search/reveal modeled as top‑N reveal to controller

License

Dual-licensed under MIT OR Apache-2.0 (see workspace metadata in Cargo.toml).

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

weiss_sim-0.2.0-cp312-cp312-win_amd64.whl (803.9 kB view details)

Uploaded CPython 3.12Windows x86-64

weiss_sim-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (953.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

weiss_sim-0.2.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (1.8 MB view details)

Uploaded CPython 3.12macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

weiss_sim-0.2.0-cp311-cp311-win_amd64.whl (804.1 kB view details)

Uploaded CPython 3.11Windows x86-64

weiss_sim-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (952.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

weiss_sim-0.2.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (1.8 MB view details)

Uploaded CPython 3.11macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

weiss_sim-0.2.0-cp310-cp310-win_amd64.whl (804.0 kB view details)

Uploaded CPython 3.10Windows x86-64

weiss_sim-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (952.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

weiss_sim-0.2.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (1.8 MB view details)

Uploaded CPython 3.10macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file weiss_sim-0.2.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: weiss_sim-0.2.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 803.9 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for weiss_sim-0.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 18ea623cab6edd809b8677dc83a4e3b157ae3311f8ac1520667b1f017e4632de
MD5 14ef2b7e237166b191e05c32ba57deac
BLAKE2b-256 bb32fde5cb8673b50d73b47e5825d62c57d850e412ae7c2730608736a4668ce4

See more details on using hashes here.

Provenance

The following attestation bundles were made for weiss_sim-0.2.0-cp312-cp312-win_amd64.whl:

Publisher: wheels.yml on victorwp288/weiss-schwarz-simulator

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

File details

Details for the file weiss_sim-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for weiss_sim-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9f6d2191769c926a2d92f7bdd30590080b9dadb09d042fca0254a29e20e05abe
MD5 bf5e55ac1b59cdb95efda2e9b87901e3
BLAKE2b-256 ea601fee61c8591cfa18d8ced5e9637fd1659bd2b231e3403ca96e1f012597a1

See more details on using hashes here.

Provenance

The following attestation bundles were made for weiss_sim-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: wheels.yml on victorwp288/weiss-schwarz-simulator

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

File details

Details for the file weiss_sim-0.2.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for weiss_sim-0.2.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 004667ec230fa6a81b94c23a4ce3460f126bddafd2d1991b9ee94ef519e4a26b
MD5 76358d2f0ebf1fb98e6058a9c6258b65
BLAKE2b-256 4aebb7049a5f5c0a22d79d4c5aaff07fc1790922458deec0a15c57b8fbc709de

See more details on using hashes here.

Provenance

The following attestation bundles were made for weiss_sim-0.2.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: wheels.yml on victorwp288/weiss-schwarz-simulator

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

File details

Details for the file weiss_sim-0.2.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: weiss_sim-0.2.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 804.1 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for weiss_sim-0.2.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 68ff2d83b53381e4923991825240c4a0b8d508a59a74ce3010fe5d1210cfba4d
MD5 7d34a7639ee983c80af86c1b914a04ed
BLAKE2b-256 7163e471b8b86457e414abcda8d215994c98f7fee042b9fb47d16d0aeed20076

See more details on using hashes here.

Provenance

The following attestation bundles were made for weiss_sim-0.2.0-cp311-cp311-win_amd64.whl:

Publisher: wheels.yml on victorwp288/weiss-schwarz-simulator

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

File details

Details for the file weiss_sim-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for weiss_sim-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 624f24ca31a2940bd5806883acd36903af77bec9707ab99285d56c54767892ba
MD5 67b70c298daa8e29310567dc8fc0c068
BLAKE2b-256 eacade4c15115bf5f70d7ecb6d6b56c9de54c3f1ef93364614764d71d6f18b04

See more details on using hashes here.

Provenance

The following attestation bundles were made for weiss_sim-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: wheels.yml on victorwp288/weiss-schwarz-simulator

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

File details

Details for the file weiss_sim-0.2.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for weiss_sim-0.2.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 59780dc9358f7bb9b6920a4ef83822600cad25157d001ed2d781b12bf481bedc
MD5 b064b1ffc7b214c35eeea60f7c8d7c53
BLAKE2b-256 a0a70fd5f072396158dd33008c16fac4b46c766dd4c92381ab385f50aed2dda2

See more details on using hashes here.

Provenance

The following attestation bundles were made for weiss_sim-0.2.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: wheels.yml on victorwp288/weiss-schwarz-simulator

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

File details

Details for the file weiss_sim-0.2.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: weiss_sim-0.2.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 804.0 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for weiss_sim-0.2.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 22f19a385e475e39bb6ceb0ed22cf3724bee041836998a8eb1224b3fd776e97c
MD5 ea872d3f5fb4a9de464ccc4d657f9829
BLAKE2b-256 8fa086d1598f33ba986d7c4c3c066023d811571f2649ff667e22b0a1afa22a40

See more details on using hashes here.

Provenance

The following attestation bundles were made for weiss_sim-0.2.0-cp310-cp310-win_amd64.whl:

Publisher: wheels.yml on victorwp288/weiss-schwarz-simulator

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

File details

Details for the file weiss_sim-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for weiss_sim-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e0ea7246d5c434c1cee11dc181ded69618593d6b4291cc280b4e8fe0e86d0aa5
MD5 4aa2a58f5b2c1cbfb75591c512957aae
BLAKE2b-256 a58588515e089942df6bf29c25a9e0f79ded00ddfea129b61ea51d73e710560f

See more details on using hashes here.

Provenance

The following attestation bundles were made for weiss_sim-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: wheels.yml on victorwp288/weiss-schwarz-simulator

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

File details

Details for the file weiss_sim-0.2.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for weiss_sim-0.2.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 26ef42362917fdb47fc79b82c6e5f739091aa051d8636059d2f0b09e4677b8fc
MD5 de919af2e7411148c80afd9fef599cea
BLAKE2b-256 eaa9fda428e186ea08f6a43da82df054632071fbe6bc291ff41a90011a1b8d94

See more details on using hashes here.

Provenance

The following attestation bundles were made for weiss_sim-0.2.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl:

Publisher: wheels.yml on victorwp288/weiss-schwarz-simulator

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