Skip to content
36 changes: 36 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,42 @@

Notable user-visible changes are recorded here. SpWKit follows semantic versioning for package releases while the public C ABI remains explicitly versioned through `SPWKIT_API_VERSION_*`.

## v0.7.0 — 2026-09-21

Behavioral/backend-contract hardening release. v0.7 defines the software-visible semantics that virtual and future physical providers must preserve, adds requirement-level ECSS SpaceWire software-conformance traceability, and makes performance-regression acceptance an explicit release gate.

### Added

- reusable public backend-contract execution for the deterministic DRIVER/reference provider (#211);
- versioned backend behavioral-equivalence matrix `v1-r1` and aggregate proof across SIMULATOR, VSPW-TP/UDP, Linux DEVICE/VSPD and DRIVER (#214);
- project-owned ECSS-E-ST-50-12C Rev.1 applicability/traceability matrix `v0.7-r2`, with seven specifically enumerated `Software verified` requirements and explicit provider/hardware-delegated, not-applicable and not-implemented/future dispositions;
- release-performance comparison tooling against immutable release baselines, repeated hosted screening and controlled same-runner aggregation;
- explicit pre-v1 ECSS-E-ST-40 and ECSS-Q-ST-80 sequencing in the v0.8/v0.9 roadmap.

### Changed

- defined and enforced same-handle serialization expectations, distinct-handle concurrency scope, lifecycle behavior, complete-operation timeout semantics, canonical result meanings, bounded-resource semantics and reset-safe zero-copy ownership epochs (#212);
- constrained the represented ECSS time-code profile to six-bit counts with `control_flags == 0`;
- removed duplicate generic packet-shape validation from the LOOPBACK backend after the public core validation path became authoritative;
- retained the zero-copy ownership guard after controlled batched measurement isolated its actual cost at approximately **+2.06 invariant-counter ticks per acquire+release pair**, while a semantics-preserving direct rewrite measured slightly slower;
- aligned package/API versioning and installed consumer requirements on the `0.7` package line.

### Verification

- common backend-contract evidence covers copied packet paths, zero-length packets, EOP/EEP, receive capacity retention, time codes, zero-copy interoperability, lifecycle, timeout/error/resource semantics and reset ownership behavior across the applicable backend families;
- controlled v0.7 performance campaigns compare against immutable `v0.6.1` at `03869c0b3bc9e895e0fe61a36f24cff2ace7d527` on matched hosts/toolchains/counters;
- post-cleanup controlled measurements show no recurring LOOPBACK regression, no recurring significant UDP regression, effectively flat DRIVER copied/lifecycle behavior, and DEVICE variation consistent with hosted measurement noise rather than a reproducible source-correlated regression;
- the existing NUCLEO-H755ZI-Q DMA2/Cortex-M7 cache qualification and immutable CCSDSPack `v2.0.0` integration baseline remain part of the provider/integration evidence;
- scoped ECSS conformance claims are backed by executable tests and limited to the requirement rows explicitly marked `Software verified`.

### Scope

- SpWKit v0.7.0 conforms to the specifically enumerated ECSS-E-ST-50-12C Rev.1 requirements/subclauses marked `Software verified` in the release matrix for the tested endpoint/link software abstraction;
- physical-layer, encoding, concrete controller/link-engine, flow-control, link-initialization/recovery, electrical and complete node time-code-engine requirements remain delegated to concrete providers/hardware;
- distributed interrupts, standardized node-management parameters and the SpaceWire MIB/service are not part of the v0.7 positive claim and are evaluated before the v1.0 API freeze;
- generic router implementation remains outside the core endpoint/link product scope;
- ECSS-E-ST-40 and ECSS-Q-ST-80 applicability/compliance work is planned for v0.8/v0.9 and is not claimed by v0.7.0.

## v0.6.1 — 2026-09-10

Maintenance and performance-consolidation release on the v0.6 line. It preserves the existing public application/backend contract while recording the completed profiling infrastructure, accepted performance optimizations, and synchronized post-v0.6 documentation.
Expand Down
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.20)
# public C ABI and is never required by the runtime implementation.
project(
spwkit
VERSION 0.6.1
VERSION 0.7.0
DESCRIPTION "SpaceWire Development & Integration Toolkit"
LANGUAGES C
)
Expand Down
31 changes: 17 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ The runtime is C11. The optional C++17 layer is header-only and forwards to the

## Project status

### Stable: v0.6.1
### Stable: v0.7.0

`v0.6.1` is a maintenance and performance-consolidation release on the v0.6 software contract. It preserves the public application/backend API while completing profiling metadata, incorporating accepted transport/readiness optimizations, and synchronizing the post-v0.6 documentation.
`v0.7.0` hardens the software-visible backend contract before the planned v0.8 API/ABI cleanup phase. It defines stable threading, lifecycle, timeout, error, resource, and zero-copy ownership semantics; makes simulator-to-backend behavioral equivalence executable; introduces scoped ECSS-E-ST-50-12C Rev.1 software-conformance traceability; and closes the release with a controlled performance-regression gate against immutable `v0.6.1`.

Highlights:

Expand All @@ -41,20 +41,23 @@ Highlights:
- packet EOP/EEP preservation, time codes, link lifecycle/state, readiness, statistics, deterministic timing/fault support, and optional zero-copy ownership;
- C11 authoritative runtime with caller-owned/no-heap construction;
- optional header-only C++17 consumer layer;
- portable `SPW_BACKEND_DRIVER` callback/configuration contract;
- portable `SPW_BACKEND_DRIVER` callback/configuration contract with a reusable public backend-contract test suite;
- DMA-capable driver ownership mapped onto the existing `spw_buffer_t` API;
- deterministic reference-driver and freestanding/no-heap evidence;
- explicit same-handle serialization, distinct-handle concurrency, complete-operation timeout, result-code, reset, and zero-copy ownership-epoch semantics;
- versioned `v1-r1` backend behavioral-equivalence evidence across SIMULATOR, VSPW-TP/UDP, Linux DEVICE/VSPD, and DRIVER;
- scoped ECSS-E-ST-50-12C Rev.1 `v0.7-r2` traceability with seven specifically enumerated `Software verified` requirements and explicit delegated/future/not-applicable boundaries;
- accepted CCSDSPack `v2.0.0` baseline at `c2f318c330c564429bcc565a8acbff22728b2851`;
- CCSDSPack PUS-C TC/TM interoperability over installed-package UDP, Linux DEVICE/VSPD, and a two-node Docker Compose topology;
- physical NUCLEO-H755ZI-Q Cortex-M7 DMA/cache/zero-copy qualification;
- completed profiling host/build/counter metadata and explicit backend coverage classification;
- controlled VSPW-TP 4096-byte RX paired overhead reduction from 60,281 to 25,032 invariant-TSC ticks (58.5%) after reassembly optimization;
- physical NUCLEO-H755ZI-Q Cortex-M7 DMA/cache/zero-copy qualification through the public driver boundary;
- controlled release-performance comparison against immutable `v0.6.1`, including removal of duplicate LOOPBACK validation and quantified retention of the reset-safe zero-copy ownership guard;
- controlled VSPW-TP 4096-byte RX paired overhead reduction from 60,281 to 25,032 invariant-TSC ticks (58.5%) retained from the v0.6 performance work;
- POSIX UDP and Linux DEVICE/VSPD optimistic-ready I/O paths that remove avoidable poll-first work while preserving timeout/error semantics;
- Debian/GHCR publication for `amd64`, `arm64`, `armhf`, and `riscv64` hosted targets.
- Debian/GHCR publication support for `amd64`, `arm64`, `armhf`, and `riscv64` hosted targets.

See the [v0.6.1 release notes](docs/releases/v0.6.1.md) and [current project status](docs/current-status.md).
See the [v0.7.0 release notes](docs/releases/v0.7.0.md), [current project status](docs/current-status.md), and [ECSS conformance boundary](docs/ecss-conformance.md).

The v0.6 public boundary deliberately stops before proprietary FPGA/HDL implementation details and before physical SpaceWire PHY/electrical interoperability claims. Hosted profiling values are reference evidence for their named environments, not physical SpaceWire performance specifications.
The public software claim deliberately stops before proprietary FPGA/HDL implementation details and before physical SpaceWire controller/PHY/electrical interoperability claims. Hosted profiling values are reference evidence for their named environments, not physical SpaceWire performance specifications.

## Supported backends

Expand Down Expand Up @@ -213,7 +216,7 @@ This is real MCU DMA/cache evidence. It is not SpaceWire PHY/electrical HIL.

CCSDSPack is an optional upper-layer integration dependency, not a dependency of `libspwkit`.

SpWKit v0.6 pins the interoperability fixture to:
SpWKit v0.7 pins the interoperability fixture to:

```text
CCSDSPack v2.0.0
Expand Down Expand Up @@ -256,25 +259,25 @@ cmake --build build-freestanding

## Installation and consumers

Stable v0.6 consumers use the exported C target:
Stable v0.7 consumers use the exported C target:

```cmake
find_package(SpWKit 0.6 CONFIG REQUIRED)
find_package(SpWKit 0.7 CONFIG REQUIRED)
target_link_libraries(my_app PRIVATE spwkit::spwkit)
```

When the package was built with `SPWKIT_ENABLE_CPP=ON`:

```cmake
find_package(SpWKit 0.6 CONFIG REQUIRED)
find_package(SpWKit 0.7 CONFIG REQUIRED)
target_link_libraries(my_cpp_app PRIVATE spwkit::cpp)
```

Standalone installed-package examples live under `examples/installed*`, distributed peers under `examples/distributed*`, and upper-layer/platform integrations under `integrations/`.

## Binary releases

`v0.6.1` publishes Debian packages for:
`v0.7.0` publishes Debian packages for:

```text
amd64
Expand Down
20 changes: 16 additions & 4 deletions benchmarks/v0.7.0-performance-evidence.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,21 @@ The primary release baseline is:

The runtime candidate measured after the LOOPBACK duplicate-validation cleanup is:

- candidate: `23eceeb0389e02d66febf5a0f027cc3e9153b14a`
- measured runtime candidate: `23eceeb0389e02d66febf5a0f027cc3e9153b14a`

The candidate commit contains the same v0.7 runtime-contract/backend-equivalence implementation as `develop` plus the narrow LOOPBACK hot-path cleanup from PR #226. Documentation-only commits after this measurement do not change the measured runtime source.
The cleanup and evidence were integrated to `develop` by PR #226 at:

- merged runtime/evidence integration point: `b89ef7871d583923dd58beb9913c1a50a4c9af2d`

The pre-v1 ECSS roadmap was then merged without runtime changes at:

- release-preparation base: `aa16b3e9abbf05e8c543e16643d3cf99f8d9189d`

The v0.7.0 package/API/release-document preparation reached the evidence-freeze point at:

- release-preparation metadata candidate: `bb2dd94aef8a0cb4aa0ba9e665937e7a637b0b39`

The commits after `23eceeb0389e02d66febf5a0f027cc3e9153b14a` do not alter the measured runtime implementation. PR #226 integrates that runtime cleanup; the later roadmap/release-preparation changes are documentation, package-version, API-version-macro, and installed-consumer requirement updates. They do not add or modify a runtime hot path. The exact final release-preparation PR head is recorded in #224 after this evidence annotation and its complete CI fan-out are green, avoiding a meaningless self-referential commit-SHA requirement inside the file that defines the final commit.

## Controlled repeated campaign

Expand Down Expand Up @@ -91,8 +103,8 @@ The original +24-tick per-call observation is retained as useful evidence about

## Release-performance conclusion

The v0.7 candidate has no unexplained reproducible software regression that warrants additional runtime optimization before release. The one attributable new fixed cost, zero-copy RX ownership validation, is approximately two architectural counter ticks per acquire+release pair in the batched probe and is required by the new reset-safe/cross-port ownership semantics.
The v0.7 runtime candidate has no unexplained reproducible software regression that warrants additional runtime optimization before release. The one attributable new fixed cost, zero-copy RX ownership validation, is approximately two architectural counter ticks per acquire+release pair in the batched probe and is required by the new reset-safe/cross-port ownership semantics.

PR #226's LOOPBACK cleanup is justified because it removes validation already performed by the public core while preserving backend-specific state, packet-size and resource checks; repeated profiling shows the LOOPBACK path back within normal v0.6.1 variation.

Final release acceptance still requires the post-merge candidate to pass the complete functional/platform/profiling CI suite and the final release-candidate evidence to be frozen before tagging `v0.7.0`.
The final v0.7.0 release-preparation head must pass the complete functional/platform/profiling and release-performance CI suites. #224 records that exact head after those checks complete and is closed before the `v0.7.0` tag may be created.
Loading
Loading