Current status: v1.1.0 released 2026-08-03 and published to PyPI. See
CHANGELOG.md for the release contents and
docs/v1-scope.md for what v1 deliberately leaves out.
-
src/cubesat_testbedpackage layout. -
uvworkflow and committeduv.lock. - GitHub Actions baseline: Ruff format check, Ruff lint, mypy, pytest.
- Pin official libcsp
v2.1at commit48f7fb0. - Build
tests/golden_vectors/bin/csp_clientin Docker. - Generate and commit
vcan0golden-vector fixtures plus sibling*.meta.tomlfiles undertests/golden_vectors/. - Add pytest fixture loader for golden vectors.
- Implement the CSP v2 single-frame codec against the fixed vectors.
- In-memory bus adapter for CI/integration tests.
- Deterministic DES core loop with virtual timeline.
- TOML setup parser and YAML scenario runner schemas.
- Byte-aligned signal codec.
- Fault Injection Engine: state override, signal override, named faults.
- Generic EPS, OBC Peer and Simple Payload modules.
- Console PASS/FAIL scenario report.
- SocketCAN adapter for Linux/HIL.
v1.1 was aimed at one group of users: flight-software engineers building smallsats. They work from a terminal, Linux, CI and git, they evaluate a tool by reading its source and its wire-level output, and they already own real hardware and real buses. The items below are ordered by how directly they unblocked that user, highest first.
- HIL runs from the CLI.
run --realtimepaces the run on aRealTimeClock, so a real peer gets wall-clock time to answer; a SocketCAN transport configured without the flag warns onstderr. Covered end to end againstvcan0under thesocketcanpytest marker. - Wire-level frame trace.
run --tracewrites decoded frames to stderr: virtual timestamp, direction, CSP header fields, raw payload bytes, and the command route or telemetry signal decoded from them. Traced at the transport boundary, so outgoing SocketCAN frames and frames an OBC Peer sends straight to the bus are visible too. Composes with--json/--quiet; observability only, with no effect on scenario semantics or determinism. - Consistent release status in the docs. The README status line, the
changelog's versioning note and the
Development Statustrove classifier now all state the same thing: 1.0.0 is tagged, released and on PyPI. - A working install path from PyPI. The examples moved into
cubesat_testbed.examplesand now ship in the wheel.run --example NAMEruns one in place andinit [DIR]copies one out to edit, sopip install cubesat-testbed && cubesat-testbed run --example defaultproduces a PASS with no clone. The README quickstart leads with that path. - Documented path to writing a custom module.
docs/writing-a-module.mdwalks through the module contract, params, telemetry wire layouts and registration, with thethermal_rcmodule and thethermal-heaterexample as the worked case. The module registry became a real extension point in the same change: the built-ins register through the same publicregister_modulecall a third-party module uses, andrun --module-importloads one from the CLI.
- Cut a GitHub Release for every pushed tag, using the matching
CHANGELOG.mdentry as the body.v1.0.0was published retroactively; it is a standing step in the release workflow now. - Record a demo of a run, including a deliberate failure and the resulting
non-zero exit code. Embedded in the README and reproducible from
docs/demo/. - CI, PyPI, license and supported-Python badges on the README, landed alongside item 3.
- CSP v1 support. A large share of flown and lab hardware still runs CSP v1 and cannot use the testbed at all today. Golden vectors first, codec after, exactly as for CSP v2; protocol version selectable from setup config. This is the largest single expansion of addressable users and the most expensive item on the list: it widens the protocol surface the project has to keep correct permanently, which is why it waited until the existing product was credible.
A FastAPI wrapper, WebSocket telemetry streams and REST fault-injection endpoints were previously planned as Phase 3. Deferred: they exist to serve a UI, and there is no UI planned (below).
A telemetry dashboard, interactive timeline, live bus analyzer and fault control
panel were previously planned as Phase 4. Deferred, because the users v1.1
targets work from a terminal and CI, where a dashboard adds no leverage and a
large maintenance surface. frontend/ and bridges/openmct/ stay dormant.
If this is revisited, the likely first step is not a live UI but a self-contained HTML run report — a single static file with the virtual-time timeline, per-assertion results, the decoded frame trace and the telemetry byte layout — since that serves CI artifacts and integration engineers without requiring a server.