Skip to content

Commit a18481f

Browse files
committed
docs: finalize v0.6.9 for GitHub and PyPI
- CHANGELOG: fold [Unreleased] into [0.6.9] - 2026-07-26 and add the belief-matching fix, which was missing entirely -- from_numpy_h decoders returned an empty array for every syndrome, the most user-visible fix in this release. - RELEASE_NOTES: add the 0.6.9 section (file previously started at 0.6.8). - README: v0.6.9 highlights table; LICENSE badge link made absolute (relative links 404 on PyPI, which renders this file as the long description); CI badge pointed at workflows/CI.yml, which does not exist (files are tests.yml / release-build.yml), so it permanently showed "no status" -- now tests.yml; BibTeX version bumped. - CITATION.cff / codemeta.json: 0.6.8 -> 0.6.9, date-released 2026-07-26. - pyproject [project.urls]: add Changelog, Release Notes and Issues so the PyPI sidebar links to them. README verified to render as PyPI will show it (readme-renderer[md]: OK). Version was already 0.6.9 in both Cargo.toml and pyproject.toml; no code changes in this commit.
1 parent e797acc commit a18481f

6 files changed

Lines changed: 62 additions & 26 deletions

File tree

CHANGELOG.md

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,9 @@ environment so report figures trace back to a specific build.
77

88
## [Unreleased]
99

10-
### Fixed
11-
- **`verify_license_token` raised instead of rejecting malformed input.** The
12-
`except RuntimeError` clauses caught neither `binascii.Error` nor
13-
`UnicodeDecodeError` (both `ValueError` subclasses), so a garbage token
14-
propagated an exception to the caller rather than returning `False`. Any
15-
caller passing attacker-influenced input crashed. Now catches
16-
`(InvalidSignature, ValueError, TypeError)`; nine adversarial inputs are
17-
locked by tests.
18-
- **Checkout no longer pins `payment_method_types=["card"]`.** Pinning it
19-
disables Stripe dynamic payment methods, so Link, Apple/Google Pay and local
20-
methods never render and every buyer must type a card number. Omitting the
21-
parameter lets Stripe show the highest-converting eligible methods per
22-
customer, configured from the Dashboard.
10+
_Nothing yet._
11+
12+
## [0.6.9] - 2026-07-26
2313

2414
### Added
2515
- **v2 licence tokens carrying `tier` and `exp`.** Legacy tokens sign only
@@ -34,13 +24,6 @@ environment so report figures trace back to a specific build.
3424
`QECTOR_BLOSSOM_INTRA_PAR`, `QECTOR_BLOSSOM_INTRA_THREADS`,
3525
`QECTOR_CUDA_DEVICE_ID`, `QECTOR_OPENCL_DEVICE_ALLOW` — with which of them can
3626
change results rather than only throughput.
37-
38-
### Notes
39-
- v0.6.8 hotfix published to PyPI, superseding the broken v0.6.7.
40-
41-
## [0.6.9] - 2026-07-24
42-
43-
### Added
4427
- **Task A — Exact log-domain BP**: `BpMethod{MinSum,Exact}` enum in `bp_osd.rs`, default `Exact`. `phi(x) = -ln(tanh(x/2))` via hybrid exact (<0.25) + 65536-entry interpolated LUT ([0.25, 20]) + 0.0 (≥20). Deterministic reliability ranking (`rel_key` 1e-6 quantization + index tie-break) fixes float-noise OSD-0 basis flipping. PyO3 `bp_method` kwarg (`"exact"`/`"min_sum"`).
4528
- **Task B — Higher-order OSD**: true combination-sweep OSD-1/2 in `bp_osd.rs` — flip subsets of W≤12 least-reliable selected columns, residual GF(2) re-solve with syndrome pre-subtraction, min-weight faithful candidate wins. PyO3 `osd_order` kwarg (0 default preserved, non-breaking).
4629
- **Task C — GNN-enhanced belief matching**: `GNNBeliefMatcher` class in `belief_matching.py` — end-to-end GNN-guided MWPM pipeline (`DetectorGraph``GNNPredecoder.predict_with_node_probs` → per-edge weights → max-per-qubit fan-in → `SparseBlossomDecoder.decode_with_weights` → faithfulness fallback). Optional synthetic training (`train_samples`/`error_rate`/`train_epochs`/`seed`). `decode_with_gnn` one-shot helper. Both re-exported at package top level.
@@ -49,6 +32,26 @@ environment so report figures trace back to a specific build.
4932
- **`stripe_integration.py`**: `create_license_token` import fallback when `generate_license_keys` is absent.
5033

5134
### Fixed
35+
- **`BeliefMatching.from_numpy_h` produced a decoder that returned an empty
36+
array for every syndrome.** The constructor built `hyper_obs` with zero rows,
37+
and `decode` returns `hyper_obs @ hard` — so any `BeliefMatching` built from a
38+
raw parity-check matrix silently decoded nothing and reported no error.
39+
`edge_obs` carried the identical defect, breaking the matching fallback for
40+
exactly the syndromes BP found hardest. Both matrices now carry qubit
41+
incidence, so `decode` returns a length-`n_qubits` correction; verified
42+
faithful (`H @ corr == syndrome`) on all 16 repetition-code d=5 syndromes.
43+
- **`verify_license_token` raised instead of rejecting malformed input.** The
44+
`except RuntimeError` clauses caught neither `binascii.Error` nor
45+
`UnicodeDecodeError` (both `ValueError` subclasses), so a garbage token
46+
propagated an exception to the caller rather than returning `False`. Any
47+
caller passing attacker-influenced input crashed. Now catches
48+
`(InvalidSignature, ValueError, TypeError)`; nine adversarial inputs are
49+
locked by tests.
50+
- **Checkout no longer pins `payment_method_types=["card"]`.** Pinning it
51+
disables Stripe dynamic payment methods, so Link, Apple/Google Pay and local
52+
methods never render and every buyer must type a card number. Omitting the
53+
parameter lets Stripe show the highest-converting eligible methods per
54+
customer, configured from the Dashboard.
5255
- **blossom.rs boundary bug**: boundary node matched without `boundary_spt`, panicking on odd-defect boundary-less codes.
5356

5457
### Performance / internals (dev.md items, this cycle)

CITATION.cff

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ authors:
66
- family-names: Lessard
77
given-names: Guillaume
88
affiliation: iD01t Productions
9-
version: 0.6.8
10-
date-released: 2026-07-20
9+
version: 0.6.9
10+
date-released: 2026-07-26
1111
url: https://www.qector.store
1212
repository-code: https://github.com/GuillaumeLessard/qector-decoder
1313
identifiers:

README.md

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# QECTOR Decoder v3
22

3-
[![CI](https://github.com/GuillaumeLessard/qector-decoder/actions/workflows/CI.yml/badge.svg)](https://github.com/GuillaumeLessard/qector-decoder/actions/workflows/CI.yml)
3+
[![CI](https://github.com/GuillaumeLessard/qector-decoder/actions/workflows/tests.yml/badge.svg)](https://github.com/GuillaumeLessard/qector-decoder/actions/workflows/tests.yml)
44
[![PyPI](https://img.shields.io/pypi/v/qector-decoder-v3)](https://pypi.org/project/qector-decoder-v3/)
55
[![Python](https://img.shields.io/pypi/pyversions/qector-decoder-v3.svg)](https://pypi.org/project/qector-decoder-v3/)
6-
[![License](https://img.shields.io/badge/License-Source_Available-blue)](LICENSE)
6+
[![License](https://img.shields.io/badge/License-Source_Available-blue)](https://github.com/GuillaumeLessard/qector-decoder/blob/main/LICENSE)
77

88
**Production-grade quantum error correction decoding library — Python + Rust.**
99
*Copyright © 2026 Guillaume Lessard / iD01t Productions. All Rights Reserved.*
@@ -234,6 +234,17 @@ Commercial licenses are issued automatically via Stripe Checkout:
234234

235235
---
236236

237+
## v0.6.9 highlights
238+
239+
| Area | Description |
240+
| --- | --- |
241+
| **Belief matching** | `from_numpy_h` decoders no longer return empty corrections — output is a faithful length-`n_qubits` vector (`H @ corr == syndrome`) |
242+
| **BP-OSD accuracy** | Exact log-domain sum-product BP by default; true combination-sweep OSD-1/2 via `osd_order` |
243+
| **GNN belief matching** | `GNNBeliefMatcher` end-to-end GNN-guided MWPM with faithfulness fallback |
244+
| **Licence hardening** | Malformed tokens return `False` instead of raising; v2 tokens carry tier + expiry inside the signature |
245+
| **Payments** | Dynamic payment methods restored at checkout (Link, wallets, local methods) |
246+
| **Docs** | Tuning env vars documented, incl. which change results vs. throughput; `docs/RELEASING.md` added |
247+
237248
## v0.6.8 highlights
238249

239250
| Area | Description |
@@ -392,7 +403,7 @@ QECTOR Decoder v3 is **source-available**. Personal, academic, educational, and
392403
author = {Guillaume Lessard},
393404
title = {{QECTOR Decoder v3}: Rust/Python Quantum Error Correction Decoding Platform},
394405
year = {2026},
395-
version = {0.6.8},
406+
version = {0.6.9},
396407
url = {https://www.qector.store},
397408
note = {Source-available. Commercial license required for commercial use.}
398409
}

RELEASE_NOTES.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,25 @@
22

33
All notable changes to QECTOR Decoder will be documented in this file.
44

5+
## [0.6.9] - 2026-07-26
6+
**Focus**: BP-OSD accuracy (exact log-domain BP, true OSD-1/2), belief-matching correctness, licence hardening.
7+
8+
### Fixed
9+
- **`BeliefMatching.from_numpy_h` decoders returned an empty array for every syndrome** — zero observable rows meant `decode` produced length-0 output with no error. Now returns a length-`n_qubits` correction with `H @ corr == syndrome` verified.
10+
- **`verify_license_token` raised on malformed input** instead of returning `False` (`binascii.Error`/`UnicodeDecodeError` escaped the old `except RuntimeError`). Nine adversarial inputs now locked by tests.
11+
- **Blossom boundary bug**: odd-defect boundary-less codes no longer panic.
12+
- Stripe checkout no longer pins `payment_method_types=["card"]`, restoring Link/wallets/local payment methods.
13+
14+
### Added
15+
- **Exact log-domain sum-product BP** (default; `bp_method="min_sum"` opt-out) and **true combination-sweep OSD-1/2** (`osd_order` kwarg).
16+
- **`GNNBeliefMatcher`** — GNN-guided MWPM pipeline with faithfulness fallback.
17+
- **v2 licence tokens** carrying `tier` + `exp` inside the Ed25519 signature; legacy tokens keep verifying; `license_claims()` exposes verified, unexpired claims.
18+
- **Tuning env vars documented** (`QECTOR_BLOSSOM_K_MULT`, `QECTOR_BLOSSOM_INTRA_PAR`, `QECTOR_BLOSSOM_INTRA_THREADS`, `QECTOR_CUDA_DEVICE_ID`, `QECTOR_OPENCL_DEVICE_ALLOW`) — with which of them change results vs. only throughput.
19+
- Licensing notice now reaches non-interactive runs (one stderr message at import; `QECTOR_SILENT=1` suppresses; silent when licensed; skipped in CI).
20+
21+
### Validation
22+
`cargo test --lib` 203 passed · clippy 0 warnings · pytest 1237 passed, 1 skipped, 0 failed · ruff check/format clean · captured under `test-results/`.
23+
524
## [0.6.8] - 2026-07-22
625
**Focus**: Hotfix for unimportable v0.6.7 wheel — guarded imports, CI smoke test, YAML fix.
726

codemeta.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"@context":"https://doi.org/10.5063/schema/codemeta-2.0","@type":"SoftwareSourceCode","name":"QECTOR Decoder v3","version":"0.6.8","description":"Production-grade Rust/Python quantum error correction decoder. 25+ decoder families: MWPM Blossom, Union-Find, BP-OSD, LDPC/qLDPC, belief-matching, CUDA/GPU batch decoding, 7-tier AutoDecoder fallback. PyMatching/Stim/Sinter compatible. Ed25519 license verification.","codeRepository":"https://github.com/GuillaumeLessard/qector-decoder","url":"https://www.qector.store","downloadUrl":"https://pypi.org/project/qector-decoder-v3/","identifier":"https://doi.org/10.5281/zenodo.20825980","license":"https://www.qector.store/license.html","programmingLanguage":["Python","Rust"],"runtimePlatform":["CPython 3.9","CPython 3.10","CPython 3.11","CPython 3.12","CPython 3.13","Linux x86_64","Windows x64","macOS arm64"],"keywords":["quantum error correction","QEC","quantum computing","quantum decoder","MWPM","PyMatching","Stim","Sinter","LDPC","qLDPC","BP-OSD","belief matching","union find decoder","surface code","Rust","Python","PyO3","maturin","QECTOR"],"author":{"@type":"Person","givenName":"Guillaume","familyName":"Lessard","affiliation":"iD01t Productions"},"publisher":{"@type":"Organization","name":"iD01t Productions"}}
1+
{"@context":"https://doi.org/10.5063/schema/codemeta-2.0","@type":"SoftwareSourceCode","name":"QECTOR Decoder v3","version":"0.6.9","description":"Production-grade Rust/Python quantum error correction decoder. 25+ decoder families: MWPM Blossom, Union-Find, BP-OSD, LDPC/qLDPC, belief-matching, CUDA/GPU batch decoding, 7-tier AutoDecoder fallback. PyMatching/Stim/Sinter compatible. Ed25519 license verification.","codeRepository":"https://github.com/GuillaumeLessard/qector-decoder","url":"https://www.qector.store","downloadUrl":"https://pypi.org/project/qector-decoder-v3/","identifier":"https://doi.org/10.5281/zenodo.20825980","license":"https://www.qector.store/license.html","programmingLanguage":["Python","Rust"],"runtimePlatform":["CPython 3.9","CPython 3.10","CPython 3.11","CPython 3.12","CPython 3.13","Linux x86_64","Windows x64","macOS arm64"],"keywords":["quantum error correction","QEC","quantum computing","quantum decoder","MWPM","PyMatching","Stim","Sinter","LDPC","qLDPC","BP-OSD","belief matching","union find decoder","surface code","Rust","Python","PyO3","maturin","QECTOR"],"author":{"@type":"Person","givenName":"Guillaume","familyName":"Lessard","affiliation":"iD01t Productions"},"publisher":{"@type":"Organization","name":"iD01t Productions"}}

pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ Documentation = "https://github.com/GuillaumeLessard/qector-decoder"
9393
Repository = "https://github.com/GuillaumeLessard/qector-decoder"
9494
Pricing = "https://qector.store/pricing"
9595
Purchase = "https://buy.stripe.com/7sY9AVdwlgoyfse9bYeUU00"
96+
Changelog = "https://github.com/GuillaumeLessard/qector-decoder/blob/main/CHANGELOG.md"
97+
"Release Notes" = "https://github.com/GuillaumeLessard/qector-decoder/blob/main/RELEASE_NOTES.md"
98+
Issues = "https://github.com/GuillaumeLessard/qector-decoder/issues"
9699

97100

98101
[project.scripts]

0 commit comments

Comments
 (0)