open-standards/.github/workflows/joule-code-conformance.yml
Transaction Science cc371d815a wai: energy reports, labelled JWP leaves and what signatures cover
Two claim classes report on one energy figure without changing the
receipt that seals it. `measurement` carries a bracket's values as
integers with each bracket's liveness facts, the build and the power
reader, and is accepted only against the receipt that carries its
figure. `operating-point` records the requested, committed and
delivered operating points and a prediction. The ratio, verdict and
residual are derived by every reader, never stated.

energy-measurement §6.2 gives the figure and the least declaration a
report's integers support as exact integer formulas; wai-rs
`energy_report` implements them with no floating-point arithmetic.
§3.1 defines a live power reader: a rail must advance in two
consecutive intervals, in at least five and in at least four of every
five, over at least 300 ms. A frozen or held rail is refused rather than
sealed under a hardware class. An unmetered `0` is never a figure of
zero joules.

A JWP object's figure, class and origin are bound into its Merkle leaf
(`\x02`), and a labelled group payload signs the total's class, its
coverage and the parent link. An object must sit at the position its
inclusion proof walks, and group signatures follow the strict Ed25519
rule claims use. `jwp_delivery` and `energy_figure` implement this in
wai-rs; joule-moq 0.2.0 builds and verifies both labelled forms.

New corpus `jwp-conformance/` with `jwp_verify.py`, more claim vectors
with the earlier ones pinned, and a CI job that runs claim_verify.py,
differential.py and jwp_verify.py. Legacy receipts keep their bytes.
External JWP implementations must adopt the `\x02` leaf and the
labelled group payload before verifying objects or groups that use
them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-01 06:37:25 -04:00

79 lines
3.1 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: joule-code conformance gate
# Enforces the Joule Code conformance contract on every change: the reference
# library must build and pass its tests, and the published C1–C4 wire vectors
# must round-trip (SPEC §8). "Conformant = round-trips the vectors" — checked,
# not asserted.
on:
pull_request:
paths:
- 'joule-code/**'
# joule-moq's receipt tests pin leaves, roots and signatures copied from WAI's
# jwp-conformance corpus, and run every leaf, group and object vector in it:
# a change there must re-run them.
- 'wai/jwp-conformance/**'
- '.github/workflows/joule-code-conformance.yml'
push:
branches:
- main
paths:
- 'joule-code/**'
# joule-moq's receipt tests pin leaves, roots and signatures copied from WAI's
# jwp-conformance corpus, and run every leaf, group and object vector in it:
# a change there must re-run them.
- 'wai/jwp-conformance/**'
- '.github/workflows/joule-code-conformance.yml'
jobs:
conformance:
name: Build + round-trip C1-C4 vectors
runs-on: linux
steps:
- name: Checkout
uses: actions/checkout@v4
# Bootstrap rustup: the docker runner image ships no Rust, and
# dtolnay/rust-toolchain cannot help — it calls `rustup`, which is absent.
- name: Install Rust 1.98.0
run: |
export PATH="$HOME/.cargo/bin:$PATH"
command -v rustup >/dev/null 2>&1 || \
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.98.0
rustup toolchain install 1.98.0 --profile minimal
rustup default 1.98.0
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
joule-code/joule-code-rs/target
key: joule-code-${{ runner.os }}-${{ hashFiles('joule-code/joule-code-rs/Cargo.lock') }}
- name: Reference library tests
working-directory: joule-code/joule-code-rs
run: cargo test --workspace
# joule-moq's QUIC transport and its example compile only with `quic`. Named
# here so they stay built and tested whatever the workspace's other members
# happen to enable; this also runs tests/wai_jwp_corpus.rs, every leaf, group
# and object vector of wai/jwp-conformance through the crate.
- name: joule-moq with the QUIC transport, every target
working-directory: joule-code/joule-code-rs
run: cargo test -p joule-moq --features quic --all-targets
- name: Round-trip the v1 conformance pack (C1-C4)
working-directory: joule-code/joule-code-rs
run: |
set -e
out="$(cargo run -q -p joule-code-conformance -- verify ../conformance/v1)"
echo "$out"
# The pack must pass with zero failures.
echo "$out" | grep -Eq '0 failed' || { echo "::error::conformance pack reported failures"; exit 1; }
- name: L3 JouleClaw binding example builds + tests
working-directory: joule-code/examples/l3-jouleclaw
run: cargo test