Skip to content

Commit edb0c90

Browse files
authored
Merge pull request #196 from QWED-AI/release-prep/v5.1.1
chore(release): prepare v5.1.1 release
2 parents 12779a5 + 288f424 commit edb0c90

15 files changed

Lines changed: 87 additions & 3647 deletions

File tree

.circleci/config.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,16 @@ jobs:
5757
# - CVE-2026-1703: pip wheel path traversal (CVSS 2.0 Low) — build-only, pinned hashes used
5858
# - CVE-2026-4539: pygments ReDoS in AdlLexer — local-only, no fix version available yet
5959
# [Expiry Guard - Owner: Security Team, Review Date: 2026-06-01]
60+
# - PYSEC-2025-183: pyjwt weak-encryption advisory — mitigated by pyproject.toml pin
61+
# (pyjwt>=2.8.0,!=2.12.1) and requirements.in exclusion.
62+
# Suppressed as belt-and-suspenders only; root fix is the version pin.
63+
# [Expiry Guard - Owner: Security Team, Review Date: 2026-08-01]
6064
/tmp/audit-env/bin/pip-audit --strict --desc \
6165
-r /tmp/audit-requirements.txt \
6266
--ignore-vuln CVE-2025-8869 \
6367
--ignore-vuln CVE-2026-1703 \
6468
--ignore-vuln CVE-2026-4539 \
69+
--ignore-vuln PYSEC-2025-183 \
6570
2>&1 | tee audit-results.txt
6671
- store_artifacts:
6772
path: audit-results.txt

.github/workflows/publish-sdks.yml

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ jobs:
1717
runs-on: ubuntu-latest
1818
# Only run if PYPI_API_TOKEN exists
1919
if: ${{ vars.PYPI_ENABLED == 'true' || github.event_name == 'workflow_dispatch' }}
20+
permissions:
21+
id-token: write # OIDC trusted publisher - no hardcoded credential needed
22+
contents: read
2023
steps:
2124
- uses: actions/checkout@v4
2225

@@ -29,18 +32,14 @@ jobs:
2932
run: pip install build twine
3033

3134
- name: Build package
32-
run: |
33-
cd sdk/python
34-
python -m build
35+
run: python -m build
3536

3637
- name: Publish to PyPI
37-
env:
38-
TWINE_USERNAME: __token__
39-
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
40-
run: |
41-
cd sdk/python
42-
twine upload dist/* --skip-existing
43-
continue-on-error: true # Don't fail if PyPI token not set yet
38+
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
39+
# OIDC trusted publisher: no token/password field required.
40+
# Configure at https://pypi.org/manage/project/qwed/settings/publishing/
41+
with:
42+
skip-existing: true
4443

4544
# ============================================
4645
# TypeScript SDK → npm
@@ -119,15 +118,16 @@ jobs:
119118
# ============================================
120119
summary:
121120
name: Publish Summary
122-
needs: [publish-typescript, publish-rust, tag-go]
121+
needs: [publish-python, publish-typescript, publish-rust, tag-go]
123122
runs-on: ubuntu-latest
124123
if: always()
125124
steps:
126125
- name: Summary
127126
run: |
128127
echo "=== SDK Publish Results ==="
128+
echo "Python (PyPI): ${{ needs.publish-python.result }}"
129129
echo "TypeScript (npm): ${{ needs.publish-typescript.result }}"
130130
echo "Rust (crates.io): ${{ needs.publish-rust.result }}"
131131
echo "Go (tagged): ${{ needs.tag-go.result }}"
132132
echo ""
133-
echo "Note: Python publish skipped until PyPI token is set"
133+
echo "Note: Python publish uses the repository root package metadata (pyproject.toml)."

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ Thumbs.db
5555

5656
# Node.js
5757
node_modules/
58+
package-lock.json
5859
npm-debug.log
5960
yarn-error.log
6061
.pnpm-debug.log

CHANGELOG.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,41 @@ All notable changes to the QWED Protocol will be documented in this file.
44

55
## [Unreleased]
66

7+
## [5.1.1] - 2026-05-21
8+
### Release Consistency and Fail-Closed Follow-Through
9+
10+
Patch release packaging the post-v5.1.0 trust-boundary and fail-closed corrections into a coherent publishable state across core package metadata, SDKs, deployment references, and release automation.
11+
12+
#### Trust Boundary and Correctness Fixes
13+
- **Cache trust-context binding**: Bound verification cache artifacts to provider/model/policy/session trust context to prevent cross-context replay.
14+
- **Attestation hardening**: Strengthened attestation verification with fail-closed behavior and follow-up review remediations.
15+
- **Audit integrity improvements**: Tightened audit logging semantics around malformed payload handling, organization isolation, and transactional durability.
16+
- **Proof-path corrections**: Refined reasoning, symbolic, batch, and agent-service fail-closed behavior where proof prerequisites or safe defaults were ambiguous.
17+
18+
#### Release and Deployment Alignment
19+
- **Version propagation**: Aligned core package, API version marker, Python SDK metadata, TypeScript SDK metadata, and Rust SDK crate version on `5.1.1`.
20+
- **Container reference alignment**: Updated Kubernetes deployment example to the published Docker Hub image/tag convention.
21+
- **Release metadata cleanup**: Prepared package metadata and deployment references for a clean `v5.1.1` publish flow.
22+
23+
#### Included PRs and merged work since v5.1.0
24+
- `#157` docs: README follow-up
25+
- `#158` fix(docker): python 3.13 upgrade follow-up
26+
- `#159` chore(deps): npm/yarn dependency follow-up in `sdk-ts`
27+
- `#160` fix(schema): strict additional-properties enforcement follow-up
28+
- `#161` fix(symbolic): fail closed when no proof exists
29+
- `#168` fix(executor): secure executor fail-closed follow-up
30+
- `#176` fix(agent): deny and handle unknown agent actions safely
31+
- `#177` fix(reasoning): require proof prerequisites before reasoning acceptance
32+
- `#178` and `#192` fix(cache): bind verification cache keys to trust context and address review follow-ups
33+
- `#179` fix(audit): fail-closed audit logging, chain isolation, and transaction hardening
34+
- `#180` fix(batch): separate batch math simplification from proof path
35+
- `#186` chore(deps): pip dependency maintenance
36+
- `#193` fix(tests): test-secret cleanup and PowerShell encoding hygiene
37+
38+
#### Upgrade Notes
39+
- Deployments using the Kubernetes example should pull `docker.io/qwedai/qwed-verification:5.1.1` instead of the older `ghcr.io/qwed-ai/qwed-core` reference.
40+
- This patch release focuses on stricter semantics, release consistency, and fail-closed enforcement rather than end-user feature expansion.
41+
742
## [5.1.0] - 2026-04-19
843
### Agent State Governance and Fail-Closed Hardening
944

README.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,20 @@
5959

6060
---
6161

62-
## 🎯 Where QWED Fits First
62+
## Release Update: v5.1.1
63+
64+
`v5.1.1` is a patch release focused on **fail-closed follow-through and release consistency** after `v5.1.0`.
65+
66+
- Tightens cache trust-context binding to prevent cross-context verification replay
67+
- Hardens attestation and audit paths toward stricter fail-closed behavior
68+
- Cleans up proof-path handling across reasoning, symbolic, batch, and agent-service flows
69+
- Aligns package versions, API version markers, SDK metadata, and deployment references for a clean release boundary
70+
71+
If you're upgrading from `v5.1.0`, review the [changelog](CHANGELOG.md) for deployment/image reference updates and patch-level boundary hardening notes.
72+
73+
---
74+
75+
## Where QWED Fits First
6376

6477
Use QWED when an LLM or AI agent must not guess:
6578

deploy/kubernetes/deployment.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ spec:
1717
spec:
1818
containers:
1919
- name: qwed-core
20-
image: ghcr.io/qwed-ai/qwed-core:5.1.0
20+
image: docker.io/qwedai/qwed-verification:5.1.1
2121
imagePullPolicy: IfNotPresent
2222
ports:
2323
- containerPort: 8000

pyproject.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "qwed"
3-
version = "5.1.0"
3+
version = "5.1.1"
44
description = "The Deterministic Verification Protocol for AI - 11 verification engines for math, logic, code, SQL, facts, images, and more. Now with Agentic Security Guards."
55
authors = [
66
{name = "QWED Team", email = "rahul@qwedai.com"},
@@ -46,7 +46,7 @@ dependencies = [
4646
"sqlmodel>=0.0.14",
4747
"bcrypt>=4.0.1",
4848
"passlib[bcrypt]>=1.7.4",
49-
"pyjwt>=2.8.0",
49+
"pyjwt>=2.8.0,!=2.12.1",
5050
"python-multipart>=0.0.6",
5151
"pandas>=2.0.0",
5252
"numpy>=1.24.0",
@@ -122,3 +122,4 @@ pythonpath = [
122122
".",
123123
]
124124

125+

qwed_sdk/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2024 QWED Team
1+
# Copyright (c) 2025 QWED Team
22
# SPDX-License-Identifier: Apache-2.0
33

44
"""
@@ -37,7 +37,7 @@
3737
VerificationType,
3838
)
3939

40-
__version__ = "5.1.0"
40+
__version__ = "5.1.1"
4141
__all__ = [
4242
"QWEDClient",
4343
"QWEDAsyncClient",

requirements.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ httpcore>=1.0.9
44
h11>=0.16.0
55
colorama==0.4.6
66
sentry-sdk>=2.8.0
7+
pyjwt!=2.12.1,>=2.8.0
78
sqlglot==20.0.0
89
defusedxml>=0.7.1

requirements.txt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# This file is autogenerated by pip-compile with Python 3.11
33
# by the following command:
44
#
5-
# pip-compile --generate-hashes requirements.in
5+
# pip-compile --generate-hashes --output-file=requirements.txt requirements.in
66
#
77
anyio==4.13.0 \
88
--hash=sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708 \
@@ -23,10 +23,6 @@ defusedxml==0.7.1 \
2323
--hash=sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69 \
2424
--hash=sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61
2525
# via -r requirements.in
26-
exceptiongroup==1.3.1 \
27-
--hash=sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219 \
28-
--hash=sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598
29-
# via anyio
3026
h11==0.16.0 \
3127
--hash=sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1 \
3228
--hash=sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86
@@ -53,6 +49,10 @@ mpmath==1.4.1 \
5349
--hash=sha256:dc4f0ea2304480d4a9a48a94c1020571558ade522b44a6912efac63a586e140f \
5450
--hash=sha256:efd6d1b75f09d69524a67609949812668b28e81ecbfe0ab449ced8c13e92642e
5551
# via sympy
52+
pyjwt==2.12.0 \
53+
--hash=sha256:2f62390b667cd8257de560b850bb5a883102a388829274147f1d724453f8fb02 \
54+
--hash=sha256:9bb459d1bdd0387967d287f5656bf7ec2b9a26645d1961628cda1764e087fd6e
55+
# via -r requirements.in
5656
sentry-sdk==2.57.0 \
5757
--hash=sha256:4be8d1e71c32fb27f79c577a337ac8912137bba4bcbc64a4ec1da4d6d8dc5199 \
5858
--hash=sha256:812c8bf5ff3d2f0e89c82f5ce80ab3a6423e102729c4706af7413fd1eb480585
@@ -68,9 +68,7 @@ sympy==1.12 \
6868
typing-extensions==4.15.0 \
6969
--hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \
7070
--hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548
71-
# via
72-
# anyio
73-
# exceptiongroup
71+
# via anyio
7472
urllib3==2.7.0 \
7573
--hash=sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c \
7674
--hash=sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897

0 commit comments

Comments
 (0)