Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
cf3f5fb
chore: Update c2pa version to v0.90.16 (#316)
tmathern Aug 27, 2026
4d909cf
Drop wheel, setuptools and pytest from runtime dependencies (#320)
fwittreverce Sep 4, 2026
63d09c6
chore: Update c2pa version from v0.90.16 to v0.90.19 (#322)
tmathern Sep 4, 2026
7ca863d
feat: scaffold trusted VSI API
mstattma Sep 9, 2026
0d48e6a
refactor: reduce trusted VSI expert bindings
mstattma Sep 10, 2026
c27d51e
chore: Update C2PA version to 0.90.22 (#324)
tmathern Sep 14, 2026
05dbc97
Merge pull request #326 from contentauth/chore/rc-preflight-tooling
scouten-adobe Sep 17, 2026
f9ea2b2
Make test_sdk_version aware of the RC-preflight ref file (#327)
scouten-adobe Sep 17, 2026
4821daf
Fix test_sdk_version regression: gate on an env var, not file presenc…
scouten-adobe Sep 17, 2026
352e268
chore: bump c2pa-rs to v0.91.0 (#325)
scouten-adobe Sep 23, 2026
eafb98d
fix: Make memory benchmark run again (#331)
tmathern Sep 24, 2026
7785f54
chore: Bump version from 0.37.11 to 0.37.12 (#332)
tmathern Sep 24, 2026
431855a
merge: update live-video VSI from contentauth main 0.37.12
mstattma Sep 24, 2026
53ed862
test: native validation time, checked crJSON, merged fixture fixes
mstattma Sep 24, 2026
58b2ce6
chore(release): prepare Castlabs conformance candidate 0.37.12.dev1
mstattma Sep 24, 2026
d813dc8
chore(release): prepare 0.37.12.dev2 after failed dev1 installed-whee…
mstattma Sep 24, 2026
83cdc47
chore(release): prepare 0.37.12.dev3 on qualified native 6fa3e010
mstattma Sep 24, 2026
f55a1fb
chore(release): prepare 0.37.12.dev4 with crJSON 2.4 conformance (nat…
mstattma Sep 24, 2026
ca7ea1a
feat: sign single-file rendition ladders with one manifest
mstattma Sep 25, 2026
6e54a5e
test: qualify ladder ownership in CI and native verification lanes
mstattma Sep 25, 2026
780e78f
feat: bind functional trusted VSI sessions
mstattma Sep 28, 2026
502b8bb
test: exercise ladder marshalling and native signing in pytest
mstattma Sep 28, 2026
7b17b36
fix(ci): accept setuptools sdist naming in functional build test
mstattma Sep 28, 2026
9f13fae
fix(ci): run release workflow shell helpers with Git bash on Windows
mstattma Sep 28, 2026
364a17e
ci: pin paired trusted VSI native to 3569fb86
mstattma Sep 29, 2026
32cc0ce
Merge commit '502b8bb2' into trial/python-presentation-signing-consol…
mstattma Sep 30, 2026
f48fbcc
fix: pair trusted VSI gate with exact consolidated native 0.92.0-dev
mstattma Sep 30, 2026
0047425
fix: propagate ladder callback errors and guard fragmented output cle…
mstattma Sep 30, 2026
c3085bd
fix: triage consume-first FFI rejections by the rejected handle id
mstattma Sep 30, 2026
f4f7dac
fix: declare C2paStream as the opaque native handle it is
mstattma Sep 30, 2026
4568ecd
chore: pair functional qualification with consolidated native 5c186c0…
mstattma Sep 30, 2026
941c2ad
fix: address review of consolidated Python deltas
mstattma Sep 30, 2026
8fbaf21
docs: record consolidated trusted VSI Python qualification
mstattma Sep 30, 2026
7ba8615
fix: preserve native ownership across consume-first failures
mstattma Sep 30, 2026
b3cc936
merge: native ownership hardening (7ba8615) and repin paired native t…
mstattma Sep 30, 2026
7058a8a
test: fail opaque ownership checks under paired qualification instead…
mstattma Sep 30, 2026
a303db8
test: clarify ownership cleanup and cover native pointer values
mstattma Sep 30, 2026
abef446
Merge commit 'a303db8dfcdd9bc493497d098bb6f0ce9249c7ed' into trial/py…
mstattma Sep 30, 2026
bc9e99d
docs: track remaining native ownership qualification follow-ups
mstattma Sep 30, 2026
5c64f2c
docs: scope stock Windows ARM64 ownership gap to this qualification
mstattma Sep 30, 2026
12d265d
ci: pair trusted VSI qualification with native 6b506352
mstattma Oct 1, 2026
3e3cc46
fix: retain signing resources through callback-initiated close
mstattma Oct 7, 2026
71d7cf9
merge: integrate trusted VSI Python review fixes
mstattma Oct 7, 2026
97c820e
fix: qualify revision-3 trusted VSI and native init globs
mstattma Oct 7, 2026
d4782fa
feat: Reader offset-aware fragment verification (c2pa_reader_with_fra…
mstattma Oct 15, 2026
fb08982
chore(release): prepare 0.37.13.dev1 on qualified native 3328b2b4
mstattma Oct 15, 2026
361fb30
docs: align trusted VSI contract and README with the 0.37.13.dev1 pins
mstattma Oct 15, 2026
78771fa
Merge pull request #5 from castlabs/feat/trusted-vsi-fragment-offset
mstattma Oct 15, 2026
adb4a8b
merge: true-merge conformance-validation-v02 into the trusted VSI 1.0…
mstattma Oct 15, 2026
563e37b
chore(release): prepare 0.37.13.dev2 on qualified native afd6fffe
mstattma Oct 15, 2026
e87d3e3
test: run native validation-time tests only on the Castlabs source build
mstattma Oct 15, 2026
4667070
Merge pull request #6 from castlabs/release/0.37.13.dev2
mstattma Oct 15, 2026
9595503
docs: plan signer-aligned +signer release versions
mstattma Oct 16, 2026
2480d2f
Merge pull request #7 from castlabs/docs/signer-aligned-versions
mstattma Oct 16, 2026
44b4bf4
chore(release): prepare signer-aligned 1.0.8 dependency on native 602…
mstattma Oct 17, 2026
abc9a03
Merge pull request #8 from castlabs/release/signer-1.0.8
mstattma Oct 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 22 additions & 5 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,17 @@ permissions:
actions: read

jobs:
trusted-vsi-paired:
name: Trusted VSI paired-source API (not release artifacts)
if: |
!startsWith(github.ref, 'refs/tags/castlabs-v') &&
(github.event_name != 'pull_request' ||
github.event.pull_request.author_association == 'COLLABORATOR' ||
github.event.pull_request.author_association == 'MEMBER' ||
github.event.pull_request.user.login == 'dependabot[bot]' ||
contains(github.event.pull_request.labels.*.name, 'safe to test'))
uses: ./.github/workflows/trusted-vsi-paired.yml

read-version:
name: Read C2PA version
if: ${{ !startsWith(github.ref, 'refs/tags/castlabs-v') }}
Expand Down Expand Up @@ -144,7 +155,10 @@ jobs:
python3 -c "from c2pa import C2paError; print('C2paError imported successfully')"

- name: Run tests
run: python3 ./tests/test_unit_tests.py
run: python3 -m pytest tests/test_unit_tests.py tests/test_sign_ladder.py

- name: Test disabled trusted API against upstream native (not ABI qualification)
run: python3 -m pytest -q tests/test_trusted_vsi_api.py -k "not paired"

tests-windows:
name: Unit tests for developer setup (Windows)
Expand Down Expand Up @@ -230,7 +244,10 @@ jobs:
python -c "from c2pa import C2paError; print('C2paError imported successfully')"

- name: Run tests
run: python .\tests\test_unit_tests.py
run: python -m pytest .\tests\test_unit_tests.py .\tests\test_sign_ladder.py

- name: Test disabled trusted API against upstream native (not ABI qualification)
run: python -m pytest -q tests/test_trusted_vsi_api.py -k "not paired"

build-linux-wheel:
name: Build Linux wheel
Expand Down Expand Up @@ -315,7 +332,7 @@ jobs:
- name: Run tests with pytest (venv)
run: |
source venv/bin/activate
venv/bin/pytest tests/test_unit_tests.py -v
venv/bin/pytest tests/test_unit_tests.py tests/test_sign_ladder.py -v

build-windows-wheel:
name: Build Windows wheel
Expand Down Expand Up @@ -407,7 +424,7 @@ jobs:
- name: Run tests with pytest (venv)
run: |
.\venv\Scripts\activate
.\venv\Scripts\pytest .\tests\test_unit_tests.py -v
.\venv\Scripts\pytest .\tests\test_unit_tests.py .\tests\test_sign_ladder.py -v

build-macos-wheel:
name: Build macOS wheels
Expand Down Expand Up @@ -496,7 +513,7 @@ jobs:
- name: Run tests with pytest (venv)
run: |
source venv/bin/activate
venv/bin/pytest tests/test_unit_tests.py -v
venv/bin/pytest tests/test_unit_tests.py tests/test_sign_ladder.py -v

sdist:
runs-on: ubuntu-latest
Expand Down
47 changes: 27 additions & 20 deletions .github/workflows/castlabs-vsi-pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ on:
workflow_dispatch:
inputs:
release_tag:
description: Existing immutable Castlabs prerelease tag
description: Existing immutable Castlabs dev-only prerelease tag (no +signer releases)
required: true
default: castlabs-v0.37.8.dev5
default: castlabs-v0.37.13.dev2
type: string

concurrency:
group: castlabs-vsi-pypi-0.37.8.dev5
group: castlabs-vsi-pypi-0.37.13.dev2
cancel-in-progress: false

permissions:
Expand All @@ -26,10 +26,17 @@ jobs:
contents: read
id-token: write
steps:
- name: Reject non-development release tags before checkout
shell: bash
env:
INPUT_RELEASE_TAG: ${{ inputs.release_tag }}
run: |
[[ "$INPUT_RELEASE_TAG" =~ ^castlabs-v[0-9]+\.[0-9]+\.[0-9]+\.dev[0-9]+$ ]]

- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
repository: castlabs/c2pa-python
ref: castlabs-v0.37.8.dev5
ref: castlabs-v0.37.13.dev2
fetch-depth: 0
path: c2pa-python

Expand All @@ -45,13 +52,13 @@ jobs:
GH_TOKEN: ${{ github.token }}
INPUT_RELEASE_TAG: ${{ inputs.release_tag }}
run: |
test "${INPUT_RELEASE_TAG}" = castlabs-v0.37.8.dev5
test "$(python3 c2pa-python/scripts/castlabs_release.py lock-value package.version)" = 0.37.8.dev5
test "$(gh api repos/castlabs/c2pa-python/releases/tags/castlabs-v0.37.8.dev5 --jq '(.draft == false and .prerelease == true)')" = true
test "${INPUT_RELEASE_TAG}" = castlabs-v0.37.13.dev2
test "$(python3 c2pa-python/scripts/castlabs_release.py lock-value package.version)" = 0.37.13.dev2
test "$(gh api repos/castlabs/c2pa-python/releases/tags/castlabs-v0.37.13.dev2 --jq '(.draft == false and .prerelease == true)')" = true
SOURCE_SHA=$(git -C c2pa-python rev-parse HEAD)
test "$(git -C c2pa-python rev-list -n 1 castlabs-v0.37.8.dev5)" = "$SOURCE_SHA"
test "$(git -C c2pa-python rev-list -n 1 castlabs-v0.37.13.dev2)" = "$SOURCE_SHA"
mkdir -p download dist
gh release download castlabs-v0.37.8.dev5 \
gh release download castlabs-v0.37.13.dev2 \
--repo castlabs/c2pa-python --dir download
python3 c2pa-python/scripts/castlabs_release.py validate-release-assets \
--assets-dir download
Expand All @@ -63,29 +70,29 @@ jobs:
--repo castlabs/c2pa-python \
--signer-workflow castlabs/c2pa-python/.github/workflows/castlabs-vsi-release.yml \
--signer-digest "$SOURCE_SHA" \
--source-ref refs/tags/castlabs-v0.37.8.dev5 \
--source-ref refs/tags/castlabs-v0.37.13.dev2 \
--source-digest "$SOURCE_SHA" \
--deny-self-hosted-runners
done
python3 c2pa-python/scripts/castlabs_release.py validate-evidence \
--evidence download/c2pa-python-0.37.8.dev5-native-linux-x86_64.tar.gz.evidence.json \
--evidence download/c2pa-python-0.37.13.dev2-native-linux-x86_64.tar.gz.evidence.json \
--artifact-dir download --source-sha "$SOURCE_SHA"
python3 c2pa-python/scripts/castlabs_release.py validate-evidence \
--evidence download/c2pa-python-0.37.8.dev5-native-windows-x86_64.tar.gz.evidence.json \
--evidence download/c2pa-python-0.37.13.dev2-native-windows-x86_64.tar.gz.evidence.json \
--artifact-dir download --source-sha "$SOURCE_SHA"
python3 c2pa-python/scripts/castlabs_release.py validate-evidence \
--evidence download/c2pa-python-0.37.8.dev5-py3-none-wheels.tar.gz.evidence.json \
--evidence download/c2pa-python-0.37.13.dev2-py3-none-wheels.tar.gz.evidence.json \
--artifact-dir download --source-sha "$SOURCE_SHA"
python3 c2pa-python/scripts/castlabs_release.py extract \
--archive download/c2pa-python-0.37.8.dev5-py3-none-wheels.tar.gz \
--archive download/c2pa-python-0.37.13.dev2-py3-none-wheels.tar.gz \
--destination dist
test "$(find dist -maxdepth 1 -name '*.whl' | wc -l)" -eq 2
cmp dist/c2pa_python-0.37.8.dev5-py3-none-manylinux_2_28_x86_64.whl \
download/c2pa_python-0.37.8.dev5-py3-none-manylinux_2_28_x86_64.whl
cmp dist/c2pa_python-0.37.8.dev5-py3-none-win_amd64.whl \
download/c2pa_python-0.37.8.dev5-py3-none-win_amd64.whl
cmp dist/c2pa_python-0.37.13.dev2-py3-none-manylinux_2_28_x86_64.whl \
download/c2pa_python-0.37.13.dev2-py3-none-manylinux_2_28_x86_64.whl
cmp dist/c2pa_python-0.37.13.dev2-py3-none-win_amd64.whl \
download/c2pa_python-0.37.13.dev2-py3-none-win_amd64.whl
python3 -m pip install packaging==25.0 twine==6.2.0
python3 -c 'from packaging.version import Version; v=Version("0.37.8.dev5"); assert v.is_prerelease and str(v)=="0.37.8.dev5"'
python3 -c 'from packaging.version import Version; v=Version("0.37.13.dev2"); assert v.is_devrelease and v.local is None and str(v)=="0.37.13.dev2"'
python3 -m twine check dist/*.whl

- name: Preflight retry-safe PyPI upload set
Expand All @@ -94,7 +101,7 @@ jobs:
run: |
STATUS=$(curl --silent --show-error --location \
--output pypi-response.json --write-out '%{http_code}' \
https://pypi.org/pypi/c2pa-python/0.37.8.dev5/json)
https://pypi.org/pypi/c2pa-python/0.37.13.dev2/json)
case "$STATUS" in
200|404) ;;
*) echo "unexpected PyPI JSON API status: $STATUS" >&2; exit 1 ;;
Expand Down
Loading
Loading