From 119afb74a0044e9adeb76629a2af18d10101df70 Mon Sep 17 00:00:00 2001 From: Imran Siddique <45405841+imran-siddique@users.noreply.github.com> Date: Tue, 1 Sep 2026 16:02:28 -0700 Subject: [PATCH] chore(release): 0.28.0 Cuts a clean release. Supersedes 0.26.0 and 0.27.0, whose sdists carry internal infrastructure identifiers in a test fixture; the wheels never did, and #107 removed them from the tree. Contents since 0.27.0: #105 public demos run against the wheel the branch would ship #106 protected-runtime evidence captured on real Azure SEV-SNP silicon #107 identifier redaction plus a CI leak scan on every push, PR and release 0.28.0 rather than 0.27.1: #106 is additive evidence work with a new test module, and #107 adds a workflow and a tool rather than only editing fixtures. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_019kmhCCZYFS1ZzQjeoQWkw4 --- CHANGELOG.md | 33 ++++++++++++++++++++++++++++++++- python/src/wcm/__init__.py | 2 +- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0171ab..bc617fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,38 @@ Notable changes to the Weight Custody Manifest specification and Python SDK. Format loosely follows [Keep a Changelog](https://keepachangelog.com/); the SDK uses semantic-ish versioning while pre-1.0. -## Unreleased +## 0.28.0 - 2026-09-01 + +**[security/packaging]** Removed internal infrastructure identifiers from two +test-fixture documents under `python/tests/fixtures/live-validation/`, and added +`tools/leak_scan.py` plus a `leak-scan` workflow that runs on every push, pull +request and published release. + +The scan matches identifier *shapes* rather than a list of known-bad strings: +bare GUIDs, cloud resource names, X.509 `serialNumber` attributes, private-key +blocks and cloud access-key IDs. The control it replaces was a manual denylist of +named entities, which by construction could not match an identifier it had never +been told about, and which only ran when someone remembered to run it. Running in +CI also closes the gap that every previous control guarded the repository's +visibility, while a package index is reached by `twine upload` regardless of what +that visibility says. + +The allowlist carries six documented exceptions, each with a reason. One is open +debt rather than a decision: `paired-2026-08-20/paired-release.json` is SHA-256 +pinned by `tests/test_paired_hardware_receipt.py`, so editing it would break the +integrity pin that shows the receipt is the one the hardware produced. It carries +a classification label and no identifiers. + +**[ci]** The public demos now run against the wheel the branch would actually +ship rather than an editable checkout, so a packaging regression fails before a +release instead of after one. + +**[ci]** The leak scan matched its `ALLOWLIST` keys against native path strings, +so on Windows every exemption missed and a clean tree failed with eleven false +findings. CI is Linux and stayed green throughout. It now compares POSIX paths, +and `tests/test_leak_scan.py` pins the separator contract, the exemption +behaviour, and that no allowlist key has gone stale against the tree. + **[evidence/hardware]** Captured protected-runtime evidence on a real Azure SEV-SNP confidential VM (`Standard_DC2ads_v5`, AMD EPYC 7763), closing the two diff --git a/python/src/wcm/__init__.py b/python/src/wcm/__init__.py index 7a82cbf..8809d51 100644 --- a/python/src/wcm/__init__.py +++ b/python/src/wcm/__init__.py @@ -194,7 +194,7 @@ score_results, ) -__version__ = "0.27.0" +__version__ = "0.28.0" __all__ = [ "__version__",