Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
42 changes: 42 additions & 0 deletions .github/workflows/full-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,47 @@ jobs:
save-if: ${{ github.ref == 'refs/heads/main' && github.event_name != 'workflow_dispatch' }}
- run: cargo xtask release-cpu

t803-cpu:
name: T.803 CPU (${{ matrix.lane }})
strategy:
fail-fast: false
matrix:
include:
- { os: ubuntu-latest, lane: linux-x86_64 }
- { os: macos-latest, lane: macos-aarch64 }
- { os: windows-latest, lane: windows-x86_64 }
runs-on: ${{ matrix.os }}
timeout-minutes: 60
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
fetch-depth: 0
- uses: dtolnay/rust-toolchain@2c7215f132e9ebf062739d9130488b56d53c060c
with:
toolchain: stable
- name: Generate exact-reference CPU evidence
shell: bash
run: |
status=0
cargo xtask t803 fetch || status=$?
if [ "${status}" -eq 0 ]; then
cargo xtask t803 run --iut cpu --out-dir target/t803/reports || status=$?
fi
echo "T803_STATUS=${status}" >> "${GITHUB_ENV}"
- name: Upload CPU T.803 reports only
if: ${{ always() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: j2k-t803-cpu-${{ matrix.lane }}-${{ github.sha }}
path: |
target/t803/reports/cpu.json
target/t803/reports/cpu.md
if-no-files-found: error
- name: Enforce CPU T.803 result after evidence upload
if: ${{ always() }}
shell: bash
run: exit "${T803_STATUS:-1}"

metal-compile:
name: Metal compile and pure tests
runs-on: macos-latest
Expand Down Expand Up @@ -459,6 +500,7 @@ jobs:
- typos
- test
- release-cpu
- t803-cpu
- metal-compile
- no-std
- miri
Expand Down
46 changes: 45 additions & 1 deletion .github/workflows/gpu-benchmarks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ on:
type: choice
required: true
default: smoke
options: [smoke, criterion, profile, adoption]
options: [smoke, criterion, profile, adoption, routing]
baseline-ref:
description: "Immutable baseline revision for Criterion comparisons"
type: string
Expand Down Expand Up @@ -134,6 +134,28 @@ jobs:
--encode-fixtures "${J2K_ADOPTION_ENCODE_FIXTURES}" \
--encode-manifest "${J2K_ADOPTION_ENCODE_MANIFEST}" \
--require-cuda --out-dir target/gpu-benchmark/adoption
- name: Measure and verify CUDA Auto routing
if: ${{ inputs.suite == 'routing' }}
env:
J2K_AUTO_ROUTING_MANIFEST: ${{ vars.J2K_AUTO_ROUTING_MANIFEST }}
J2K_AUTO_ROUTING_ROOT: ${{ vars.J2K_AUTO_ROUTING_ROOT }}
PROFILE_MODE: ${{ inputs.profile-mode }}
run: |
: "${J2K_AUTO_ROUTING_MANIFEST:?Set J2K_AUTO_ROUTING_MANIFEST}"
: "${J2K_AUTO_ROUTING_ROOT:?Set J2K_AUTO_ROUTING_ROOT}"
mkdir -p target/gpu-benchmark/auto-routing
export J2K_AUTO_ROUTING_CANDIDATE_SHA="${GITHUB_SHA}"
export J2K_AUTO_ROUTING_EVIDENCE="${GITHUB_WORKSPACE}/target/gpu-benchmark/auto-routing/evidence.json"
export J2K_AUTO_ROUTING_HARDWARE="$(nvidia-smi --query-gpu=name --format=csv,noheader | paste -sd ';' -)"
export J2K_AUTO_ROUTING_DRIVER="$(nvidia-smi --query-gpu=driver_version --format=csv,noheader | sort -u | paste -sd ';' -)"
args=()
if [ "${PROFILE_MODE}" = quick ]; then args+=(--quick); fi
cargo bench --profile release-bench -p j2k-cuda --bench auto_routing --features cuda-runtime -- "${args[@]}"
cargo xtask auto-routing verify \
--evidence "${J2K_AUTO_ROUTING_EVIDENCE}" \
--external-manifest "${J2K_AUTO_ROUTING_MANIFEST}" \
--criterion-root target/criterion \
--out target/gpu-benchmark/auto-routing/verified.json
- name: Require unchanged CUDA device identity
if: always()
run: |
Expand Down Expand Up @@ -231,6 +253,28 @@ jobs:
--encode-fixtures "${J2K_ADOPTION_ENCODE_FIXTURES}" \
--encode-manifest "${J2K_ADOPTION_ENCODE_MANIFEST}" \
--require-metal --out-dir target/gpu-benchmark/adoption
- name: Measure and verify Metal Auto routing
if: ${{ inputs.suite == 'routing' }}
env:
J2K_AUTO_ROUTING_MANIFEST: ${{ vars.J2K_AUTO_ROUTING_MANIFEST }}
J2K_AUTO_ROUTING_ROOT: ${{ vars.J2K_AUTO_ROUTING_ROOT }}
PROFILE_MODE: ${{ inputs.profile-mode }}
run: |
: "${J2K_AUTO_ROUTING_MANIFEST:?Set J2K_AUTO_ROUTING_MANIFEST}"
: "${J2K_AUTO_ROUTING_ROOT:?Set J2K_AUTO_ROUTING_ROOT}"
mkdir -p target/gpu-benchmark/auto-routing
export J2K_AUTO_ROUTING_CANDIDATE_SHA="${GITHUB_SHA}"
export J2K_AUTO_ROUTING_EVIDENCE="${GITHUB_WORKSPACE}/target/gpu-benchmark/auto-routing/evidence.json"
export J2K_AUTO_ROUTING_HARDWARE="$(sysctl -n machdep.cpu.brand_string)"
export J2K_AUTO_ROUTING_DRIVER="macOS $(sw_vers -productVersion); $(xcrun metal --version | head -n 1)"
args=()
if [ "${PROFILE_MODE}" = quick ]; then args+=(--quick); fi
cargo bench --profile release-bench -p j2k-metal --bench auto_routing -- "${args[@]}"
cargo xtask auto-routing verify \
--evidence "${J2K_AUTO_ROUTING_EVIDENCE}" \
--external-manifest "${J2K_AUTO_ROUTING_MANIFEST}" \
--criterion-root target/criterion \
--out target/gpu-benchmark/auto-routing/verified.json
- name: Require unchanged Metal device identity
if: always()
run: |
Expand Down
46 changes: 46 additions & 0 deletions .github/workflows/gpu-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,26 @@ jobs:
elapsed="$(( $(date +%s) - started ))"
echo "CUDA full wall time: ${elapsed}s" | tee -a "${GITHUB_STEP_SUMMARY}"
exit "${status}"
- name: Compile packaged CUDA adapter and dependencies as an external consumer
run: cargo xtask package-consumer-smoke --target cuda --cuda-runtime
- name: Generate exact-reference CUDA adapter evidence
if: ${{ always() }}
run: |
status=0
cargo xtask t803 fetch || status=$?
if [ "${status}" -eq 0 ]; then
cargo xtask t803 run --iut cuda --out-dir target/t803/reports || status=$?
fi
echo "T803_STATUS=${status}" >> "${GITHUB_ENV}"
- name: Upload CUDA T.803 reports only
if: ${{ always() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: j2k-t803-cuda-linux-x86_64-${{ github.sha }}
path: |
target/t803/reports/cuda.json
target/t803/reports/cuda.md
if-no-files-found: error
- name: Ensure pinned coverage tool
run: scripts/ensure-cargo-llvm-cov.sh
- name: Collect changed-line CUDA host coverage
Expand All @@ -215,6 +235,9 @@ jobs:
coverage-cuda-summary.json
coverage-cuda-regions.json
if-no-files-found: error
- name: Enforce CUDA T.803 result after evidence upload
if: ${{ always() }}
run: exit "${T803_STATUS:-1}"

metal-full:
name: Metal full release validation
Expand Down Expand Up @@ -261,6 +284,26 @@ jobs:
elapsed="$(( $(date +%s) - started ))"
echo "Metal full wall time: ${elapsed}s" | tee -a "${GITHUB_STEP_SUMMARY}"
exit "${status}"
- name: Compile packaged Metal adapter and dependencies as an external consumer
run: cargo xtask package-consumer-smoke --target metal
- name: Generate exact-reference Metal adapter evidence
if: ${{ always() }}
run: |
status=0
cargo xtask t803 fetch || status=$?
if [ "${status}" -eq 0 ]; then
cargo xtask t803 run --iut metal --out-dir target/t803/reports || status=$?
fi
echo "T803_STATUS=${status}" >> "${GITHUB_ENV}"
- name: Upload Metal T.803 reports only
if: ${{ always() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: j2k-t803-metal-macos-aarch64-${{ github.sha }}
path: |
target/t803/reports/metal.json
target/t803/reports/metal.md
if-no-files-found: error
- name: Ensure pinned coverage tool
run: scripts/ensure-cargo-llvm-cov.sh
- name: Collect changed-line Metal host coverage
Expand All @@ -277,3 +320,6 @@ jobs:
coverage-metal-summary.json
coverage-metal-regions.json
if-no-files-found: error
- name: Enforce Metal T.803 result after evidence upload
if: ${{ always() }}
run: exit "${T803_STATUS:-1}"
14 changes: 13 additions & 1 deletion .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,19 @@ jobs:
--aggregate-job "Release candidate aggregate" \
--gpu-workflow gpu-validation.yml \
--cuda-job "CUDA full release validation" \
--metal-job "Metal full release validation"
--metal-job "Metal full release validation" \
--t803-scope all \
--t803-out-dir target/t803/release-evidence
- name: Verify downloaded T.803 report contents
if: ${{ github.event_name == 'push' }}
run: |
candidate_sha="$(git rev-parse HEAD)"
cargo xtask t803 verify --scope all --candidate-sha "${candidate_sha}" \
--report "target/t803/release-evidence/j2k-t803-cpu-linux-x86_64-${candidate_sha}/cpu.json" \
--report "target/t803/release-evidence/j2k-t803-cpu-macos-aarch64-${candidate_sha}/cpu.json" \
--report "target/t803/release-evidence/j2k-t803-cpu-windows-x86_64-${candidate_sha}/cpu.json" \
--report "target/t803/release-evidence/j2k-t803-cuda-linux-x86_64-${candidate_sha}/cuda.json" \
--report "target/t803/release-evidence/j2k-t803-metal-macos-aarch64-${candidate_sha}/metal.json"
- name: Verify release metadata integrity
run: cargo xtask release-integrity
- name: Verify final publish metadata
Expand Down
32 changes: 32 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,38 @@
This changelog tracks the current release line. Historical phase notes
and stale roadmap entries have been removed from the public documentation set.

## [0.8.1] - 2026-08-06

- Adds release-scoped ISO/IEC 15444-4:2024 / ITU-T T.803 v3 decoder evidence.
The CPU IUT is Profile-1 Cclass-1 compliant, Profile-1 Cclass-1HF compliant,
and Annex G JP2 reader compliant across all 90 selected cases with zero skips
on macOS arm64, Linux x86-64, and Windows x86-64.
- Publishes separate CUDA and Metal adapter-IUT results for the same selected
codestream classes. Each headline is 0/90 device-native, 48/90 hybrid, and
42/90 CPU-routed; reports disclose parsing, Tier-1, dequantization, IDWT,
MCT, color/output, and transfer execution per case.
- Adds exact codestream-resolution decoding through
`decode_native_components_at_reduction` and explicit Annex G normalization
through `decode_srgb8`, including Gray/RGB/RGBA layouts, component mapping,
palettes, CDEF ordering, subsampling, enumerated color spaces, and restricted
ICC conversion.
- Fixes Part 1 decoder conformance defects in irreversible midpoint
reconstruction, ROI handling, packet/header parsing, progression and tile-part
handling, component transforms, and JP2 validation without vector-specific
exceptions or relaxed tolerances.
- Adds deterministic Annex D/F encoder ICS matrices. The CPU matrix passes
28/28 cases and the CUDA and Metal matrices pass 25/25 through the pinned
T.804 OpenJPEG decoder; this is informative encoder evidence, not the formal
decoder claim.
- Independently verifies `p0_13.j2k` before harness normalization: the
production decoder and OpenJPEG match all 257 native components exactly.
- Promotes only benchmark-qualified fixed `Auto` hybrid cells after identical
output, at least 10% median improvement, and non-overlapping Criterion 95%
confidence intervals. Explicit CUDA and Metal requests remain strict.
- Makes tag publication verify all three CPU reports plus the CUDA and Metal
reports for the exact release SHA, and rotates the public API compatibility
baseline to the published `v0.8.0` release.

## [0.8.0] - 2026-07-29

- Breaking: decoding is strict by default in `j2k` and `j2k-native`. Callers
Expand Down
Loading
Loading