Repository navigation
Conversation
📏 PR diffNote Actual code changed: 302,699 lines🟢 +237,219 added 🔴 −65,480 removed Tests, docs, fixtures, and helper scripts excluded.
Every changed line is classified once. |
Collaborator
|
Collaborator
Author
|
Collaborator
|
Collaborator
|
Collaborator
|
Collaborator
Cancelling due to test failure: 11 tests still running PASS [ 2.068s] jolt-kernels cuda::common::pairing::tests::multi_miller_warp_matches_arkworks PASS [ 1.580s] jolt-kernels cuda::common::prefix_suffix::tests::two_pair_prefix_suffix_matches_cpu_round_for_round PASS [ 1.538s] jolt-kernels cuda::common::primitives::tests::add_matches_cpu PASS [ 1.707s] jolt-kernels cuda::common::prefix_suffix::tests::windowed_prefix_suffix_matches_the_whole_domain_round_for_round PASS [ 5.990s] jolt-kernels cuda::common::msm::tests::g2_frobenius_span_matches_arkworks PASS [ 1.486s] jolt-kernels cuda::common::primitives::tests::arithmetic_matches_cpu_at_modulus_boundaries PASS [ 1.572s] jolt-kernels cuda::common::primitives::tests::bind_high_to_low_matches_cpu PASS [ 1.997s] jolt-kernels cuda::common::primitives::tests::add_scalar_matches_cpu PASS [ 1.471s] jolt-kernels cuda::common::primitives::tests::bind_low_to_high_matches_cpu PASS [ 1.240s] jolt-kernels cuda::common::primitives::tests::eq_evals_matches_cpu PASS [ 1.756s] jolt-kernels cuda::common::primitives::tests::eq_evals_shard_matches_the_whole_table_window ──────────── Summary [ 16.457s] 131/359 tests run: 130 passed, 1 failed, 159 skipped FAIL [ 2.058s] jolt-kernels cuda::common::pairing::tests::multi_miller_above_the_warp_threshold_matches_arkworks warning: 228/359 tests were not run due to test failure (run with --no-fail-fast to run all tests, or run with --max-fail) error: test run failed |
Collaborator
Collaborator
$ cargo nextest run -p jolt-prover --features prover-fixtures,cuda --cargo-quiet
──────────── Nextest run ID e5535244-3302-478c-b2f8-972110194407 with nextest profile: default Starting 21 tests across 5 binaries (1 test skipped) PASS [ 0.004s] jolt-prover stages::drivers::twin_tests::missing_session_carry_fails_at_prepare PASS [ 0.004s] jolt-prover stages::drivers::twin_tests::driver_twin_with_absent_option_member PASS [ 0.005s] jolt-prover stages::drivers::twin_tests::driver_twin_with_head_aligned_member PASS [ 0.005s] jolt-prover stages::drivers::twin_tests::driver_twin_with_present_option_member PASS [ 0.005s] jolt-prover stages::drivers::twin_tests::populated_cells_for_absent_member_fail_at_prepare PASS [ 23.973s] jolt-prover::byte_diff inline_sha3::prover_matches_legacy_on_sha3_inline PASS [ 29.555s] jolt-prover::byte_diff advice_consumer::prover_matches_legacy_on_advice_consumer_address_major PASS [ 0.010s] jolt-prover::engine_twins clear_engine_twin_matches_generated_verify_clear PASS [ 0.029s] jolt-prover::engine_twins committed_engine_twin_matches_generated_verify_zk PASS [ 0.008s] jolt-prover::engine_twins uniskip_prover_twin_matches_uniskip_verify_clear PASS [ 42.320s] jolt-prover::byte_diff advice_consumer::prover_matches_legacy_on_advice_consumer PASS [ 54.107s] jolt-prover::byte_diff committed_muldiv::prover_matches_legacy_on_committed_muldiv_many_chunks PASS [ 54.439s] jolt-prover::byte_diff committed_muldiv::prover_matches_legacy_on_committed_muldiv SLOW [> 60.000s] jolt-prover::byte_diff chunk_boundary::prover_matches_legacy_on_sha2_chain_across_collect_rows_chunks SLOW [> 60.000s] jolt-prover::byte_diff advice_committed::prover_matches_legacy_on_committed_advice_consumer SLOW [> 60.000s] jolt-prover::byte_diff address_major::prover_matches_legacy_on_address_major_fibonacci SLOW [> 60.000s] jolt-prover::byte_diff advice_committed::prover_matches_legacy_on_committed_advice_consumer_address_major SLOW [> 60.000s] jolt-prover::byte_diff committed_muldiv::prover_matches_legacy_on_committed_muldiv_many_chunks_address_major SLOW [> 60.000s] jolt-prover::byte_diff committed_muldiv::prover_matches_legacy_on_committed_muldiv_address_major SLOW [> 60.000s] jolt-prover::byte_diff muldiv::prover_matches_legacy_on_muldiv PASS [ 60.240s] jolt-prover::byte_diff chunk_boundary::prover_matches_legacy_on_sha2_chain_across_collect_rows_chunks PASS [ 62.381s] jolt-prover::byte_diff address_major::prover_matches_legacy_on_address_major_fibonacci PASS [ 75.480s] jolt-prover::byte_diff advice_committed::prover_matches_legacy_on_committed_advice_consumer PASS [ 75.513s] jolt-prover::byte_diff committed_muldiv::prover_matches_legacy_on_committed_muldiv_many_chunks_address_major SLOW [> 60.000s] jolt-prover::byte_diff wide_one_hot::prover_matches_legacy_on_muldiv_wide_one_hot PASS [ 105.334s] jolt-prover::byte_diff committed_muldiv::prover_matches_legacy_on_committed_muldiv_address_major SLOW [>120.000s] jolt-prover::byte_diff advice_committed::prover_matches_legacy_on_committed_advice_consumer_address_major SLOW [>120.000s] jolt-prover::byte_diff muldiv::prover_matches_legacy_on_muldiv PASS [ 128.346s] jolt-prover::byte_diff advice_committed::prover_matches_legacy_on_committed_advice_consumer_address_major FAIL [ 142.488s] jolt-prover::byte_diff muldiv::prover_matches_legacy_on_muldiv stdout ─── running 1 test test muldiv::prover_matches_legacy_on_muldiv has been running for over 60 seconds test muldiv::prover_matches_legacy_on_muldiv ... FAILED failures: failures: muldiv::prover_matches_legacy_on_muldiv test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 12 filtered out; finished in 142.37s stderr ─── thread 'muldiv::prover_matches_legacy_on_muldiv' (72749) panicked at crates/jolt-prover/tests/byte_diff.rs:1047:14: the cuda Dory proof must verify end-to-end: FinalOpeningVerificationFailed { reason: "opening proof verification failed" } note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace Cancelling due to test failure: 1 test still running SLOW [>120.000s] jolt-prover::byte_diff wide_one_hot::prover_matches_legacy_on_muldiv_wide_one_hot SLOW [>180.000s] jolt-prover::byte_diff wide_one_hot::prover_matches_legacy_on_muldiv_wide_one_hot SLOW [>240.000s] jolt-prover::byte_diff wide_one_hot::prover_matches_legacy_on_muldiv_wide_one_hot PASS [ 250.521s] jolt-prover::byte_diff wide_one_hot::prover_matches_legacy_on_muldiv_wide_one_hot ──────────── Summary [ 274.500s] 21 tests run: 20 passed (7 slow), 1 failed, 1 skipped FAIL [ 142.488s] jolt-prover::byte_diff muldiv::prover_matches_legacy_on_muldiv error: test run failed
|
Collaborator
Collaborator
|
nextest_output.txt |
Collaborator
|
@protoben codex managed to solve it, I'm attaching a prompt that should explain to your claude what the issue was and how to fix it. |
a16z#2135) * fix(jolt-program): reject compressed and misaligned rows without Rv64C decode_instruction checked only the decoded kind against the selected profile. A profile without Rv64C, such as RV64IM_JOLT, still accepted compressed encodings and 4-byte instructions at 2-byte-aligned addresses. When the profile lacks Rv64C, decode_instruction now rejects compressed rows with the new ProgramError::IllegalCompressedInstruction and then rejects addresses that are not 4-byte aligned, both before the kind is decoded. Profiles that include Rv64C, including the default RV64IMAC_JOLT, are unchanged. jolt-riscv gains a named RV64I profile, which replaces four identical test-local constants in jolt-program and is used by the new decode and ELF tests. * test(jolt-program): keep RV64I profile test-local and trim review-flagged tests Remove the public RV64I profile and its re-export; tests that need a base-only profile define it locally. Drop the fingerprint, non-base rejection and ELF RV64I acceptance tests, and the trailing assembly comments in the decode and ELF tests.
a16z#2147) * chore(deps): clear the RustSec findings behind the nightly cargo audit Bump ctutils 0.4.2 -> 0.4.6 (RUSTSEC-2026-0385) in the root lockfile and the seven fuzz lockfiles that pin it, and zstd-sys 2.0.16 -> 2.1.2 (RUSTSEC-2026-0410) in the root lockfile. Ignore the advisories that have no compatible fix, in a new .cargo/audit.toml with the reachability argument for each: - RUSTSEC-2026-0387 (crypto-bigint 0.5.5): the RustCrypto 0.13 curve stack needs 0.5, and the latest alloy releases still require k256 0.13. Only examples/sig-recovery (public-key recovery) and jolt-inlines-p256 tests (throwaway keys) reach it. - RUSTSEC-2026-0391 and RUSTSEC-2026-0395..0406 (zstd 0.13.3, zstd-safe 7.2.4): lockfile-only. The weak `reth-codecs?/serde` edge locks reth-codecs -> reth-zstd-compressors -> zstd, but no build enables reth-codecs, and reth-zstd-compressors 0.8.2 still requires zstd 0.13. Also correct the workflow header, which still said only two fuzz workspaces commit a lockfile; all twelve do. Closes a16z#2138. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(deps): drop reth-codecs from the lockfile instead of ignoring zstd The sig-recovery example decodes EIP-2718 bytes and never serializes a reth type, so it needs neither reth crate's `serde` feature nor reth-ethereum-primitives' default `std`. Those features carried the weak `reth-codecs?/...` edges that locked reth-codecs -> reth-zstd-compressors -> zstd. Without them, 13 packages leave Cargo.lock, including zstd, zstd-safe and zstd-sys, so the 13 zstd ignores go away. RUSTSEC-2026-0387 is the only ignore left. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(deps): drop the reth feature comment from Cargo.toml Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * chore(deps): move the jolt-inlines-p256 tests to p256 0.14 The p256 0.13 dev-dependency was one of two paths to crypto-bigint 0.5.5 (RUSTSEC-2026-0387). p256 0.14 sits on elliptic-curve 0.14 and crypto-bigint 0.7.10. It takes a rand_core 0.10 RNG, so the rand dev-dependency moves to 0.10 (already locked via plonky3). It also renames `to_encoded_point` to `to_sec1_point` and deprecates `SigningKey::random` in favor of `Generate::generate_from_rng`. alloy's k256 0.13 in examples/sig-recovery is now the only path to crypto-bigint 0.5, and the audit.toml entry says so. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix(jolt-host): read the guest ELF once under a build lock Every `jolt build`, even a no-op, has cargo delete and re-link the uplifted guest ELF. Tests that build the same guest in parallel share one target directory, so a test reading the ELF by path (the post-build existence check, `built_elf`, and the later `get_elf_contents` in `build_jolt_program`) could land in that window and panic with "Built ELF not found" or "ELF contents not available". `Program` now holds a `GuestElf` (path plus bytes) read once, right after the build, while an exclusive lock on `<guest_target_dir>/.jolt-build.lock` is held from before `jolt build` until the read completes. Every later consumer uses the stored bytes; the path remains only for tracer panic symbolization. * fix(jolt-host): alias io::Error and drop the clippy::panic expectation The style job rejects `io::Result` under the nominal-import rule, and a plain `use std::io::Result` would shadow the two-parameter `Result` used elsewhere in the file, so `GuestElf::read` returns `Result<Self, IoError>`. The ELF read now uses `.expect`, already covered by the function's `clippy::expect_used` expectation, so the added `clippy::panic` goes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Michael Zhu <mchl.zhu.96@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…d bytecode (a16z#2139) Row conversion now compares the executed instruction with the full preprocessed row, including opcode, normalized operands, address, compression flag, and virtual-sequence metadata. A mismatch returns BytecodeInstructionMismatch with the bytecode PC and expected and actual instructions; missing addresses or expansion positions still return MissingBytecodePc. Both eager tracing and chunk replay perform this validation, and the documentation explains that mutable instruction fetch remains unchanged and chunked execution detects mismatches during replay. Fixes a16z#1952. Refs a16z#1952 Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Co-authored-by: Michael Zhu <8365992+moodlezoup@users.noreply.github.com>
Bumps [schemars](https://github.com/GREsau/schemars) from 1.2.2 to 1.2.3. - [Release notes](https://github.com/GREsau/schemars/releases) - [Changelog](https://github.com/GREsau/schemars/blob/master/CHANGELOG.md) - [Commits](GREsau/schemars@v1.2.2...v1.2.3) --- updated-dependencies: - dependency-name: schemars dependency-version: 1.2.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…16z#2111) * feat(transcript)!: one sealed transcript over spongefish 0.8 states Replaces the transcript stack (J1-J9) with its final form in one change. - jolt-transcript: a sealed Transcript/FieldTranscript over spongefish ProverState/VerifierState. Absorbs are positional and word-aligned with no labels; sessions are 32-byte protocol tags and a SHAKE128 session id; bound digests are SHA3-256 (Keccak-256 behind `keccak256-digests`). - Challenges: full-width BN254 scalars; Dory's group-scalar challenges are short, sized from their loss. - Proof-of-work mechanism only (no protocol site uses it yet): one u64 nonce word, MAX_POW_BITS = 57, difficulty priced from the challenge-set size, and a sequential search through an owned `verifier_message_oracle`. - Sumcheck, openings, Dory, HyperKZG, Akita, BlindFold, the verifier and prover, SDK, examples, jolt-eval and fuzz targets run on it. - Akita grouped statements carry a role code for main's fused-increment group. - FS inventories re-blessed; verifier fuzz bundles regenerated. * chore(jolt-eval): drop rayon from jolt-transcript in the fuzz lockfile * feat(akita): run Akita's opening inside Jolt's Fiat-Shamir sponge (J8) Jolt's trace batch now runs Akita's argument on Jolt's own transcript state instead of bridging to a standalone Akita session: Akita binds its instance descriptor and writes its messages into Jolt's argument string, and the verifier checks end-of-string once, after the opening. - jolt-openings: GroupBatchOpening carries the grouped prove/verify entry points on the concrete spongefish states, with a PendingEof the verifier hands back for check_eof. - jolt-akita: the trace batch calls batched_prove_embedded / batched_verify_embedded. append_verifier_setup, append_batch_statement and bridged_akita_session go away; Akita's descriptor binds the setup, schedule row and layout. A trace-batch proof that also carries a standalone backend proof is rejected. The generic BatchOpeningScheme and single-polynomial paths still run Akita standalone. - Schedule catalogs regenerated for Akita's descriptor v6 (epoch 6). - jolt-prover / jolt-verifier stage 8 pass the state through, and the FS inventories are re-blessed. The Akita pin in Cargo.toml is a placeholder (Akita main) until LayerZero-Labs/akita#254 lands; see the TODO there. * chore(akita): pin Akita to a16z#254's head 4fba41edb The Akita stack merged main (a16z#212, a16z#213, a16z#223), dropped an unused dev-dependency, kept the transcript event log across fold previews and regenerated its planner-cost snapshots. Akita's own schedule catalogs are unchanged. * ci: fix the Rust workflow's duplicated run key Merging main left the old jolt-sumcheck command under the new "Test jolt-blindfold with its prover" step, so the step had two run keys and GitHub rejected the whole workflow without running it. Also drop the removed jolt-transcript parallel feature from the every-sponge test and update the clippy comment that referred to it. * docs(transcript): spec and book chapter for the sealed spongefish transcript * docs(transcript): Akita's opening runs in Jolt's sponge * style: import Ordering, Encoding and Transcript; allow hex "ba" in Rust * style: use the imported protocol_tag in Akita's batching tests * docs(transcript): scope the Fiat-Shamir chapter by configuration and enforcement * test: end the misaligned-access assert with a semicolon * refactor(transcript)!: draw Dory's challenges full width Drops challenge_short_scalar, challenge_bits_for_loss, the Dory loss table and its burst test, and the exact dory-pcs pin. Curve verifier time is not a priority, and a16z#2174's Dory verifier optimizations more than offset the cost. * test: re-bless FS inventories and regenerate verifier fuzz bundles * test(verifier): bump FIXTURE_MAGIC for the new proof format Every transcript byte changes in this PR, but the cached verifier fixtures kept JVCF0008, the value main writes, and cached fixtures load without an acceptance check. JVCF0011 is unused by any branch (a16z#2137 uses JVCF0010). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test(field): check the Solinas word fold against big-integer reduction The oracle was a test-only copy of the byte-at-a-time fold that the word fold replaced. Compare with num-bigint `% p` instead, as bn254_differential.rs does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * style(verifier): drop a duplicated cfg on Stage8BatchEntry Left behind when the LabelWithCount import was removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * refactor(sumcheck): delete the test-only CompressedRoundPoly wrapper Production absorbs compressed rounds through append_compressed_round and verifies them with CompressedSumcheckProof. The wrapper had no production caller and carried its own compressed-round checks. honest_prove_compressed and the compressed roundtrip now absorb through append_compressed_round and verify a CompressedSumcheckProof against the polynomial's evaluation. The tests that only exercised the wrapper are removed, and the FS absorb inventory loses the wrapper's site. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * test: re-bless FS inventories and regenerate verifier fuzz bundles * fix(sumcheck)!: bind the committed output-claim count The committed sumcheck's output-claim commitments were absorbed with no count, so a public caller that accepted any count could move a commitment across the message boundary without changing a challenge. Absorb the count as a u64 word ahead of the commitments, as main's LabelWithCount did. * test: regenerate verifier fuzz bundles * test: regenerate verifier fuzz bundles * test: regenerate verifier fuzz bundles * chore(deps): pin Akita to the stack tip * test(fuzz): regenerate zk verifier bundles on merged main * chore(deps): pin Akita to the corrected stack tip * chore(deps): pin Akita to the merged stack tip 9f8ad8a91 * fix(jolt-akita): pin the K=256 one-hot chunk size and regenerate schedules Akita a16z#258 switched DEFAULT_UNIT_ONEHOT_SOURCE_CHUNK_SIZE to 16. JoltOneHotK256Direct inherited it through OneHot's committed_source_class, so K=256 rows were priced for one hot position per 16 coefficients and the backend rejected Jolt's K=256 sources. Declare the class explicitly, as the K=16 policy already does, and regenerate every catalog at the new pin. * test(jolt-verifier): regenerate fuzz bundles and the FS inventory The clear bundles came from main under its transcript; regenerate them on the merged tree. The inventory records the SetupPolicy argument now passed to batched_verify_embedded. * test(jolt-transcript): gate the whole-word absorb helper with its caller append_values_matches_per_value_absorbs and the Encoding import were compiled, unused, under feature sets without solinas and bn254. * style(recursion): taplo-format the guest hash-inlines feature * fix(akita): address review of the embedded Akita opening - book: name the pinned Akita revision (8d5821f45), not 9f8ad8a91, which is not an ancestor of the pin; same for the policy-spec link. - book: Akita's sparse ring challenges are drawn on Jolt's sponge, so "every challenge on Jolt's transcript is full width" is now scoped to Jolt's own draws. - jolt-transcript: the `prover-grinding` comment said verifier builds leave `yolocrypto` off; every Akita build has it through akita-prover. - profile: the trace batch's `backend_proof` is always empty, so the Akita size telemetry reported 0. Report the argument-string size and drop the callerless `AkitaBatchProof::unframed_payload_size`. Document that `backend_proof` is empty for the trace batch. - recursion: `tamper-opening` flipped a byte of the empty `backend_proof` and panicked; it now flips the argument string's last byte, which is Akita's. Drop the guest's dead BLAKE2b jolt-transcript edge and the host's unused Keccak inline registration. - jolt-verifier: `Stage8Output` is gated off the Akita build, where it had only a never-constructed variant. Document that the Akita stage-8 `verify` and `GroupBatchOpening::verify_batch` return before acceptance. - FS scanner: only `batched_verify_embedded` leaves the scanned crates. `verify_batch` calls between scanned crates and `check_eof` were recorded as absorb and challenge sites; re-bless drops those 10 entries. - tests: `akita_schedule_selection_tampers_reject` covers the selection on the embedded path (flipped digests and other fixtures' valid rows); `proof.narg` joins the tamper manifest; the streamed-batch comment no longer claims the setup-mismatch cases reach Akita's descriptor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Michael Zhu <mchl.zhu.96@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: sumchecker <241190306+sumchecker@users.noreply.github.com> Co-authored-by: Markos Georghiades <mgeorghiades@a16z.com>
…16z#2122) * feat(jolt-prover): check known eager storage requests on the original backend An explicit MemoryBudget, taken by jolt_sdk::prove_program and the profile CLI's --memory-budget, is checked after tracing and before the witness, proving and profile PCS setup. A request below the trace buffer capacity plus the largest priced stage-1-3 envelope fails with ProverError::MemoryBudgetExceeded; no budget skips the check and leaves the original kernels, slots and tracer unchanged. Each envelope folds the verifier's stage member lists over the eager kernels' own peak_bytes (Spartan outer and product remainders, shift, instruction input, register claim reduction). Stages 2 and 3 add one generation of the original RAM access columns: the shared u32 address column, counted once, and the two u64 value columns, which stage 3 keeps reserved because no stage boundary waits for their queued drop. The check covers a named subset only: passing it does not mean the proof fits, it is not a lower bound, and stage 4's second column collection, unpriced members and later stages stay outside it. * feat(jolt-prover): reserve stage-4/5 register storage in the eager check Extend MemoryBudget::check_known_eager from the stage-1-3 envelope to stages 1-5 on the original backend. Stage 4 prices the register read/write kernel of the configured phase order with the rd indices it parks, at three entries per cycle and with the second cycle bind's T/4 increment allocation retained; stage 5 prices the value evaluation that takes the indices over. RAM access columns are priced per stage from one helper beside the real collectors: the shared u32 address backing once, plus one u64 value pair per generation that may still be held. Stages 2, 3 and 5 reserve the stage-2 generation (its drop is queued, never joined); stage 4 adds the value check's own pair, which it drops synchronously at its second bind. The check remains a partial request reservation: passing does not mean the proof fits, and the documentation lists the owners it omits. * fix(jolt-kernels): bound coefficient LUT saturation by the square root On 32-bit targets such as wasm32, lut_saturated squared the read LUT's saturated length, 2^16, in usize, which overflows. With overflow checks (cargo check) the const assertion beside it fails on the overflow; without them (the release wasm32 builds) the square wraps to 0, a 2^16-entry LUT reads as unsaturated, and the assertion itself fails. Compare the length with MAX_LUT_VALUES.isqrt() instead: v > isqrt(M) holds exactly when v * v > M, without forming the product. On 64-bit targets the predicate is unchanged for every length below 2^32, which includes every length the schedule reaches (2, 4, 16, 256 and 65536), so the LUT schedule and CycleState::peak_bytes, which reads only lut_len, are unchanged. * fix(jolt-prover): reject eager reservations past the address space The eager prices used saturating arithmetic, so a reservation past usize::MAX saturated to usize::MAX and a usize::MAX budget admitted it. Every price is now checked: a stage reservation or trace sum past usize::MAX fails every budget with ProverError::MemoryReservationOverflow, while a representable reservation still passes at exactly the reported requirement. The regression prices 2^(usize::BITS - 7) proof rows (2^25 on wasm32), where stage 1's Az and Bz alone need 2^BITS bytes, without allocating. * fix(jolt-kernels): price the LT tables' dense switch With kernels priced over the trace's proof rows, a short prefix no longer covers the √T-entry tables built from a sumcheck point. SplitLt::peak_bytes now counts the dense table the last lt_lo bind builds beside the three split tables, which the register value evaluation reserves, and the docs list the eq factor tables that the prices leave out instead of claiming that later phases hold less. * test(jolt-prover): count the value check's collection in the stage-4 floors Since the main merge, stage 4 also reserves what the value check's collection holds until it truncates. The register read/write floors left that allowance out, so their 32,784 bytes of slack exceeded the 32,768-byte increment allocation the cycle-first floor is meant to catch. The floors now carry stage 4's whole RAM term. * docs(jolt-kernels): describe the remainder allowance after factored opening weights * refactor(sdk): defer proof budget opt-in to limited tracing
* feat(profiling): add macOS hardware counters * fix(profiling): name the V6 core subset perflevel0 and skip it on single-level Macs XNU fills rusage V6's ri_pinstructions/ri_pcycles from CLUSTER_TYPE_P CPUs, which is hw.perflevel0: "Performance" on M1-M4 but "Super" on an M5 Max. On non-AMP kernels (Intel Macs, where kern.monotonic.supported can be 1) the subset is always zero, so V6 reported fabricated zeros. Request V6 only when hw.nperflevels >= 2 (a missing sysctl means a kernel older than V6); single-level hosts read V4 and report the subset as null. Rename performance_cores to perflevel0 in the summary, schema, stage boundary log, and docs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Move crates/jolt-field to crates/jolt-algebra and rename the package. crates/jolt-field becomes a re-export of jolt-algebra that forwards its features, so dependents keep their manifests and imports, and Akita's Git dependency on jolt-field (redirected by the root [patch]) still resolves to the one shared field identity. CI jobs, hol-light proof scripts, fuzz docs, the verifier's clippy arithmetic allow-list, and path lists that name the implementing crate follow the move. The shared-field identity check requires one identity for each of jolt-algebra and jolt-field, and the Metal isolation check covers jolt-algebra. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Andrew Tretyakov <42178850+0xAndoroid@users.noreply.github.com>
Pure rename: package jolt-zk, crate jolt_zk. Dependents, workspace manifests, lockfiles, CI steps, the AI merge-gate risk policy, semgrep boundaries, the jolt-eval crate list, specs and CLAUDE.md follow. The fs-obligation inventories are reblessed for the path change only. BlindFold protocol types, transcript labels and proof bytes are unchanged. The crate will hold the other zero-knowledge building blocks (sumcheck masking and the lattice Σ-protocol) next to BlindFold. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Andrew Tretyakov <42178850+0xAndoroid@users.noreply.github.com>
Akita's ZkOpeningScheme impl ran a transparent opening and returned the evaluation's bytes as its "hiding" commitment, and its verify_zk always errored; its ZkBatchOpeningScheme impl errored on every call. No caller needs them: the akita and zk features are mutually exclusive, and the verifier's ZK entry point is compiled only without akita. Remove both impls, the AkitaHidingCommitment stand-in, the transparent_zk_error helper, and the two tests that only exercised them. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Andrew Tretyakov <42178850+0xAndoroid@users.noreply.github.com>
* feat(bench): add pinned CPU proof bundles and raw paired measurements * fix(bench): pin runner resources and record explicit compiler targets * fix(bench): build the guest CLI from a pinned Git checkout * feat(bench): gate CPU suites and validate trusted result publication * fix(bench): resolve added guest dependencies before locked builds * docs(bench): include transfers and publication in the PR time gate * fix(bench): preserve builds across workflow checkout cleanup * docs(bench): align administrator registration with runner group * fix(bench): bound cache and validate calibrated comparisons * docs(bench): declare native build prerequisites * docs(bench): preserve coreutils in native prerequisites * ci(bench): build only the requested prover executables Keep the release PR subset to the existing Akita Fibonacci, SHA2 and BTreeMap points. Build the real guest-builder CLI separately with its existing Dory dependency closure, and select prover executables from the requested supported cases. Preserve complete-main bundle reuse, exact provenance, input/PCS cache variants and the eight-entry retention bound. Main and nightly retain both PCS, their existing schedule and timeout. Reuse Quang Dao's PR2204 Apple Silicon HOL Light setup fix verbatim. Source PR: a16z#2204 Source commit: a16z@9d479d0 Co-authored-by: Quang Dao <qvd@andrew.cmu.edu> * ci(bench): schedule nightly benchmarks at 07:00 UTC Keep the configured 180-minute job timeout and all runtime inputs unchanged. State the once-per-case pilot's limits without implying full-nightly duration or completion. Hosted-job and queue overhead remain unmeasured. * ci(bench): separate builder profile and record command timings Build the actual-source guest-builder CLI under ci while preserving the workflow prover's release profile and the guest release arguments. Record guest_builder_profile independently in manifests and completed-cache identity. Record start arguments and elapsed command outcomes in the existing build log, including failures, without excluding preparation from the full clock. Limit PR measurement jobs to 10 minutes; main/nightly retain 180 minutes. Document interrupted/missing results and preserve the complete external-time acceptance requirement. Extend only the directly affected owned fixtures. * fix(bench): preserve identical effective build input timestamps Keep forced source checkout and cleanup, but retain the prior mtime only when an overlaid input, patched manifest or resolved lockfile has identical final bytes. Changed inputs still invalidate normally. The owned Git fixture reproduces timestamp-only churn and checks changed/deleted inputs and cleanup. Emit stable Cargo compiler-artifact JSON in build.log so the next real run can record unit freshness and candidate compilation. This does not attribute prior build latency or claim that the PR budget is met. * ci(bench): use qualified off16 profile for PR proofs * ci(bench): build release artifacts on hosted runners Separate pinned preparation from artifact verification and run-only execution. Use repository release settings with znver4 code generation; host-generic ci helpers prepare guests without executing target-ISA binaries. Bind plan, manifest and payload hashes and preserve trusted publication restrictions. Keep the 24-proof baseline and stage the measured-fitting 17-cell proposal separately. Public output bytes allow the matched off-host equivalence control. * ci(bench): publish the pinned plan before compilation * fix(bench): preserve hosted diagnostics and request receipts * ci(bench): limit hosted build concurrency after OOM * ci: add hosted swap capacity for release benchmark builds * ci(bench): adopt measured hosted PR suite * fix(bench): mark automatic calibration unavailable * ci(bench): measure cold and Cargo-warm hosted builds * ci(bench): record hosted replay and remove temporary builder * ci(bench): gate local PR builds on maintainer labels * fix(bench): recheck only the label and head before local PR builds The PR API base.sha lags the planned merge^1 and merge_commit_sha moves whenever main advances, so comparing them refused almost every labelled PR after the queue wait. The plan already pins the base and merge it builds. The disabled comment validator and writer drop the same base.sha check and keep the test merge as their staleness check. The target job uses !cancelled(); its finalize and upload steps still run on cancellation. Docs state that later pushes to a labelled branch run on the persistent account and give the steady-state enablement condition. * fix(bench): preserve merge-only metrics during rebase * chore(bench): simplify secp256k1 guest target declarations * Revert "chore(bench): simplify secp256k1 guest target declarations" This reverts commit a5f3f68. * refactor(bench): reuse the gated secp256k1 guest * fix(bench): support per-leg native harness fallback * ci(bench): dispatch target runs through the Pika App * ci(bench): retain contained executor units and recover PR results * ci(bench): publish authenticated external calibration references * ci(bench): admit calibration jobs and validate bootstrap outcomes * docs(bench): make forced public key readable by runner --------- Co-authored-by: Quang Dao <qvd@andrew.cmu.edu>
* feat(ci): add prover benchmark history dashboard * fix(bench): preserve history comparisons and legacy publishing * fix(bench): gate Pages activation and stabilize host identity * docs(bench): describe the Pages tradeoff without internal roles * feat(bench): publish opt-in PR history to the existing Pages branch * fix(bench): ignore skipped producer runs and bind the plan PR number Unadmitted PR pushes and label events complete as skipped producer runs. The publisher ignores them and the collector refuses them, instead of archiving a rejected PR row and requesting a Pages build for each push. Failed and cancelled admitted runs are still archived. The plan's PR number must appear in the producer run's pull_requests. The book now describes the steady state. * docs(bench): state the missing PR association rejection conditionally * ci(bench): collect App-ingested prover history * ci(bench): retain history after a measured PR merges * ci(bench): archive calibration evidence and verify bootstrap runs * docs(bench): remove temporary merge-order instructions * docs(bench): describe external calibration in history views * docs(bench): locate calibration bands in check results
…rge conflicts (a16z#2314) * fix(ci): clear stale AI gate labels and track merge conflicts * fix(ci): refresh conflicting PR heads and share mergeability retries
Run each profiler in disposable scratch outside the exported results, while keeping metrics and process logs in the result tree. Preserve the executor symlink refusal. Fetch cached build snapshots at depth one to restore shallow boundaries, including after a prior incomplete import, so the CLI build script can read its commit metadata.
…tive compaction (a16z#2316) * fix(ci): remove cumulative classifier input token cap * fix(ci): budget classifier compaction at $50 per attempt * fix(ci): reserve long-context prices for every classifier request * fix(ci): retain upstream classifier error diagnostics
…r owner (a16z#2185) * perf(akita): keep auxiliary commitment buffers compact and reuse their owner * chore(akita): pin the compact-source commits on LayerZero-Labs/akita Point every Akita crate at LayerZero-Labs/akita at the same revision (ec0efc73, the head of LayerZero-Labs/akita#292) instead of the personal fork, and update the native-batching import comment: FusedInc and full-width objects are now committed on the trace backend, so only foreign handles are recomputed. --------- Co-authored-by: Quang Dao <qvd@andrew.cmu.edu>
…16z#2322) * fix(bench): identify ingest workflows by source path * docs(bench): correct ingest identity checks
* fix(bench): isolate prover peak RSS from harness memory * docs(bench): list GNU time as a runtime prerequisite
* feat(bench): post sticky end-to-end PR comparisons * fix(bench): exclude exact three-percent changes * docs(bench): clarify comparison rows and backend names * fix(bench): identify revisions and bound comment posting
… unfit Akita setups (a16z#2123) * feat(jolt-prover,jolt-akita): reserve RAM storage by phase and reject unfit Akita setups feat(jolt-prover): reserve the RAM value check's first bind in the eager check Stage 4 of the known-eager check charged the RAM value check only its two RAM access column generations. It now charges the check from preparation through its first bind (ram_val_check::first_bind_bytes): those columns, counted once, plus the larger of the parallel collector's chunk views and the address eq table, the doubled table its first bind builds and the split LT tables. Stages 2, 3 and 5 keep their single-generation allowance. feat(jolt-akita): reject budgeted profile setups whose sources cannot fit Under Akita, an explicit --memory-budget now also bounds PCS setup. After the known eager check, the profile subtracts the bytes the trace output, program and program preprocessing hold at capacity (owner-local heap_bytes accessors) and passes the remainder to AkitaScheme::setup_with_known_source_limit. Before allocating the one-hot backend setup, that computes Akita's SetupRequirements from the selected one-hot catalog, rejects the request when the flat public matrix plus the setup-prefix sources exported beside it exceed the limit, and allocates through new_prover_setup with the same requirements. Passing prices only those buffers, not the whole setup or proof; the sizing trace still queued for a background drop is not counted. The limit prices only the one-hot single-chunk setup without grouped rows; any other shape is rejected under a limit. Unbudgeted setup is unchanged. Akita disk-persistence stays off: a cache hit skips generation and export, so enabling it requires gating or repricing the check. ram_val_check::first_bind_bytes now states that it holds only for the canonical prover dimensions its caller receives (log_t >= 8, or >= 12 under Akita). feat(jolt-prover): reserve stage-2 RAM and instruction storage by phase Stage 2 of the known-eager check charged the product remainder and one generation of RAM access columns. The driver prepares every member before any member binds, so stage 2 now pairs phases instead: the RAM read-write kernel from its preparation through its first bind, with RAF's folded and unmap K tables (ram_read_write::first_bind_bytes), beside the instruction claim reduction's storage after its preparation (OptimizedInstructionClaimReduction::post_prepare_peak_bytes). The RAM term prices the cycle- or address-major matrix at its largest entry count, which also covers the reduction's construction collect. A phase split that prepare rejects before allocating prices zero. Owner-local helpers size the low-to-high split-eq tables, the round-0 and address-major first-bind collects (pinned Rust 1.95 and Rayon 1.12 growth and list-node facts) and the reduction's post-preparation window. The address-first single-copy allowance assumes the optimized backend's sequential member scheduler, and the reduction's narrower window relies on the unconditional RAM term; both conditions are documented where they apply. The check remains a partial request reservation. feat(jolt-prover): reserve the RAM value check's scalar windows in the eager check Stage 4 of the known-eager check priced the RAM value check only through its first bind. It now prices the larger of the check's two largest scalar-table windows (ram_val_check::scalar_window_bytes): the second bind, which builds the T/4 increment table beside both value-column generations and the 2K address table, and the fourth bind, which holds the 8K and 16K address tables; both add the split LT tables and price the increment table at T/4. A compile-time assertion pins the eight-wide lazy address tables the windows assume. W4's chunk-view helper in ram_trace.rs has no caller left and is reverted. The larger stage 4 masked the stage-2 phase fixtures and the register floors' retained-increment signal. The phase tests move to geometries where stage 2 still dominates (Fr cycle-first, 2^18 cycles and 2^12 addresses; Akita address-first, 2^14 and 2^10), a literal test pins the address-first half-length copy at the stage-2 RAM term the check consumes, and the register floors add stage 4's RAM term as the check prices it. The book names the stage-2 instruction-reduction and RAM terms. * fix(jolt-akita): accept grouped one-hot setups under a known source limit The profile's budgeted Akita setup always failed: setup_with_known_source_limit rejected any grouped schedule, and grouped_setup_params always adds the bounded-dense increment group (FusedIncLayout), so every --memory-budget profile run returned InvalidSetup and panicked at "Akita PCS setup". Grouped rows extend the one-hot catalog the priced setup requirements are built from, so the flat public matrix check already covers them. Only full-width dense groups build separate, unpriced backend setups; those are still rejected. The new test builds parameters through grouped_setup_params. * docs(jolt-prover): drop the stale sizing-trace caveat before Akita setup run_workload traces the guest once since a16z#2189, so no sizing trace is queued for a background drop. * fix(jolt-prover,jolt-kernels,jolt-akita): compose budget checks and pin the collector bounds MemoryBudget records what each check reserves, so the eager reservation, the profile's caller buffers and the Akita setup matrix share one budget. A rejected setup matrix is a typed OpeningsError::SetupExceedsBudget, and the profile returns budget and setup rejections instead of panicking. setup_with_known_source_limit becomes setup_with_matrix_byte_limit. The round-0 and first address-major collectors (fold plus par_concat since RAM phase split fails the eager check with the kernel's own error, stage 2's window where RAM prepares beside the reduction's table is an explicit term, shift sizes use checked_shl, and the stage-2 and read-write tests pin exact byte counts.
…rs (a16z#2252) `AkitaVerifierResources::prepared_setup_bytes` exports the complete backend key (matrix and setup-prefix registry) in the existing prepared-payload framing. `prepare_with_trusted_setup` borrows such a body in place through `TrustedBytes`, checks that its descriptor matches the capacity and seed the ordinary catalogs require and that every required prefix slot is present, then builds the same general verifier `prepare` builds. No catalog row is preselected and no missing material is derived as a fallback. The caller vouches for the body's provenance; the structural checks only reject a key built for another capacity or seed, or a malformed body. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.


No description provided.