Repository navigation
chore(deps): pin dev's Jolt crates to Jolt main (f5c1947b1) - #252
Conversation
dev pinned every a16z/jolt crate at c7c2d08d5 on the unmerged metal/fp64-ext2 branch. Its jolt-metal work has since landed on Jolt main through squash merges (#1938, #1939, #1944, #1946, #2005), so every pin moves to Jolt main 5aa807b03 and the three lockfiles are regenerated. Jolt main replaced the safe Batch::dispatch with the unsafe Batch::dispatch_unchecked, whose caller must keep each kernel inside its bound buffers. Each of akita-metal's nine dispatch sites now carries a SAFETY argument checked against the kernel source and the host-side shape checks that size its buffers. No kernel or shape check changes. scripts/check-jolt-pins-on-main.sh, run as a new CI job, fails when a tracked Cargo.toml or Cargo.lock pins a16z/jolt at anything but a full commit hash that is an ancestor of Jolt main. It reads main's full commit graph through a treeless partial clone, so no shallow history can make an old pin look unrelated.
|
Warning This PR has more than 500 changed lines and does not include a spec. Large features and architectural changes benefit from a short spec before implementation review. If this PR is a bug fix, small cleanup, or otherwise does not warrant a spec, feel free to ignore this message. |
Documentation blast radius (advisory)These regions may need doc/spec/book updates based on changed paths. Changed files in this PR: 38
|
PCS Profile Benchmark
13 of 13 profiles passed. Times are medians of Each sample verifies the same proof first with the configured multi-threaded pool and then with one thread. Both timings reuse the same verifier setup. Merge-base comparisons are available for Benchmark shards
Public opening statements
One-hot profiles generate deterministic witnesses with one Direct evaluates the public setup contribution during Stage 2. Recursive carries the same check through a Stage 3 setup-product sumcheck. Both modes execute the complete fold schedule and terminal verification. The chunked profiles Generated profiles may select different A, B, and D ring dimensions at different fold levels. The short profile names omit those dimensions. Each sample generates deterministic witnesses and opening points, prepares setup, commits, proves, serializes the proof, checks its size, prepares verifier setup, and verifies the claimed openings. It does not test malformed proofs. Phase time
Proof size and protocol shape
Grinding retries are rejected attempts at each fold, listed in measured-run order. Zero means the first sampled nonce was accepted. Each multi-group profile has two precommitted nv16 singleton polynomials and two polynomials in the displayed final group. Native proof accounting
Memory and setup size
Deltas are shown only for profiles with a matching merge-base case. Negative is smaller or faster. The uploaded |
Jolt main's generated verifier now returns Result<(), VerifierError> instead of bool (a16z/jolt#2064), so the recursion host's `!is_valid` no longer compiles. The host reports the verifier's error and logs `accepted` in place of `is_valid`; the README and the Book follow. Every pin moves to Jolt main 14315e958, which also carries #2107. That change moves Jolt's own Akita pin to dfdbd76 (Akita main, NIST category 3), which reaches the recursion profile's lockfile only through jolt-sdk; dfdbd76 pins Jolt 1618f4b6d, also on main. Proof blobs are unchanged.
cargo fmt --check inside profile/akita-recursion failed on dev: imports were out of order or over-long in six files. rustfmt only reorders and wraps use lines.
Brings in dev 9247e8e (main sync #264). The conflicts were import lines in profile/akita-recursion, which take dev's TrustedTerminalCache and ChunkedWitnessCfg imports, and fuzz/Cargo.toml, which takes dev's #194 rewrite. Moves every a16z/jolt pin from 14315e958 (and dev's c7c2d08d5) to the current Jolt main tip f5c1947b1, in the root, fuzz and recursion-profile manifests and lockfiles. The seven new Jolt commits do not touch jolt-field, jolt-poly, jolt-utils or jolt-metal; they reach only the recursion profile through jolt-sdk.
CI test timing
Run summary
Wall time spans 2 parallel nextest slice shards. Slowest tests
Regressions vs main
New slow testsNo new tests ≥30s vs main baseline. |
Brings in the dev merge (#252, Jolt pinned at f5c1947b1) and the akita-labinius-pcs jolt-field repin.
Summary
devpinned every Jolt crate atc7c2d08d5, a commit on the unmergedmetal/fp64-ext2branch. This PR moves every pin to the current Joltmaintip,f5c1947b1. It also adds a CI check so that a Jolt pin that isn't onmaincan't come back.Why the pin can move to main
c7c2d08d5's own commits change onlyjolt-metal, plus a spec and a report script. That work landed on Joltmainas squash merges: a16z/jolt#1938, #1939, #1944, #1946 and #2005. Git doesn't countc7c2d08d5as part ofmain, because squash merges create new commits, but its content is there.jolt-field,jolt-polyandjolt-sdkatc7c2d08d5are just an oldermain. Moving the pin picks up about a hundred commits of ordinary progress onmain.Changes
Pins. Every
a16z/joltrevin the root,fuzz/andprofile/akita-recursion/manifests moves fromc7c2d08d5tof5c1947b1. That includesakita-labinius-prover,akita-labinius-verifier,akita-zk-proverandakita-zk-verifier. The three lockfiles are updated in place: Cargo changes only the Jolt entries, plus the arkworks entries described below.The last seven Jolt commits. I first moved the pins to
14315e958, then tof5c1947b1afterdevpicked up the 169-bit SIS sync (chore(dev): sync main into dev (2026-10-25) #264). The seven commits in between (fix(jolt-eval): read Criterion estimates from where Criterion writes them a16z/jolt#2128–#2131, #2097, #2099, #2142) touchjolt-transcript(field challenge codecs and proof of work on the sponge),jolt-claims,jolt-verifier,jolt-program, the guest runtime'smemcpy, and Jolt's own tooling. None of them touchesjolt-field,jolt-poly,jolt-utilsorjolt-metal, the only Jolt crates Akita's own crates depend on. They reach only the recursion profile, throughjolt-sdk, and needed no source change there.akita-metal. Joltmainreplaced the safeBatch::dispatchwithunsafe fn Batch::dispatch_unchecked. The caller must now promise that each kernel stays inside the buffers it is given, and that its threads synchronize correctly.All 9 call sites now carry a
SAFETYcomment. Each one is checked against both the kernel source and the host-side shape checks that size the buffers. The sites are:No kernel or shape check changed.
Recursion host. Jolt main's generated verifier returns
Result<(), VerifierError>instead ofbool(fix(sdk)!: return the verification error from generated verify a16z/jolt#2064). The host reports the verifier's error instead of negating a bool, and it logsacceptedwhere it loggedis_valid. The README and the Book line that quote that log are updated to match.Jolt's own Akita pin. Jolt
mainpins Akita atdfdbd7674(feat(akita)!: NIST category 3 Module-SIS and 2^31 schedule coverage a16z/jolt#2107), which is on Akitamain.jolt-sdk. It is a separate copy of Akita that this workspace's own crates never use, so it doesn't conflict withdev.dfdbd7674pins Jolt1618f4b6d, which is on Joltmain.arkworks in the recursion profile. The profile patches
ark-*to a16z'sarkworks-algebradev/twist-shoutbranch, as Jolt does. Re-resolvingjolt-sdkmoved that branch from76bb3a45tob8f0f512, the commit Joltmain's own lockfile uses.scripts/check-jolt-pins-on-main.sh, run as the newJolt pins on mainCI job. The script reads everya16z/joltrev in trackedCargo.tomlandCargo.lockfiles. It fails if a rev is not a full commit hash, or is not an ancestor of Joltmain.The ancestry check needs Jolt's full commit history, so the script fetches it with a treeless partial clone (every commit, no file contents), not a shallow one. A shallow clone would wrongly reject old pins.
AGENTS.mdlists the script in the preflight checks.The
ctutils0.4.5 bump this PR used to carry is now ondevthrough #263.Validation
Run locally on macOS (Apple M-series) at 76a4c40:
cargo fmt --all --check(root and recursion profile),taplo fmt --checkandtypospass.scripts/check-jolt-pins-on-main.shpasses. The pins it finds aref5c1947b1and1618f4b6d. The second reaches the profile lockfile throughjolt-sdk's own pin of Akita, and it is on Joltmain.scripts/check-shared-field-identity.shreports onejolt-fieldand onejolt-polyidentity atf5c1947b1in every workspace, including the recursion profile.-D warningspasses in the four workspace configurations fromci.yml(default, no-parallel,akita-pcsresponse-model diagnostics,dev-protocol), the LaBinius trinomial, binary, SIS and prover/verifier configurations, andakita-metal.jolt-verifier-profile-smoke.ymlpass withRUSTFLAGS=-D warnings:akita-recursion-gluetests (16 passed), the same withtrusted-benchmark-artifact(22 passed), andcargo check --releaseof the recursion workspace.fuzz/:cargo fmt --check,cargo check --locked --workspace --all-targets,cargo test -p akita-fuzz --lib(4 passed) andcargo test --release -p akita-fuzz-runner(20 passed).Proof bytes. The Jolt source Akita's own crates compile against is unchanged between
14315e958andf5c1947b1, because none of the seven new commits touchesjolt-field,jolt-poly,jolt-utilsorjolt-metal. The comparison from the earlier revision of this PR still holds: at14315e958,akita-recursion-artifactproduced byte-identical setup-plus-proof blobs todevononehot_fp32:30:1,onehot_fp64:30:1andonehot_fp128:36:1:direct.GPU tests
No CI workflow runs the
akita-metalGPU tests, because they are macOS-only. I ran them at 76a4c40 withcargo test --profile ci-test -p akita-metal --lib --tests. All 38 passed: 5 unit tests plus thecrt,decompose,matvec,mont,nttandonehotintegration tests. These tests need a GPU and fail without one; they never skip.Interaction with #229
#229 adds
crates/akita-labinius-pcs, which pinsjolt-fieldatdev's oldc7c2d08d5. Whichever of the two lands second has to move that line and its lockfile entry tof5c1947b1. TheJolt pins on mainjob fails until it does.🤖 Generated with Claude Code