Visitar URL original
CUDA kernels for modular Jolt by protoben · Pull Request #9 · GaloisInc/jolt · GitHub
Skip to content

CUDA kernels for modular Jolt - #9

Open
protoben wants to merge 961 commits into
mainfrom
feature/cuda-kernels
Open

protoben wants to merge 961 commits into
mainfrom
feature/cuda-kernels

Conversation

@protoben

@protoben protoben commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

No description provided.

@github-actions

github-actions Bot commented Sep 1, 2026 •

Copy link
Copy Markdown

📏 PR diff

Note

Actual code changed: 302,699 lines

🟢 +237,219 added    🔴 −65,480 removed

Tests, docs, fixtures, and helper scripts excluded.

Category 🟢 Added 🔴 Removed
⌨️ Actual code +237,219 −65,480
🧪 Tests +132,840 −13,009
📚 Docs +50,646 −5,659
📦 Fixtures +17,720 −2,108
🔧 Helper scripts +41,666 −1,415
Total diff +480,091 −87,671

Every changed line is classified once.

@benoitrazet

benoitrazet commented Sep 1, 2026 •

Copy link
Copy Markdown
Collaborator
$ CUDA_LAUNCH_BLOCKING=1 RUST_LOG=info cargo run --release -p jolt-prover --features=profiling,cuda -- profile --name sha2-chain --scale 24 --backend cuda --format chrome 
warning: /home/benoit/JOLT/jolt/crates/jolt-kernels/Cargo.toml: `default-features` is ignored for jolt-poly, since `default-features` was not specified for `workspace.dependencies.jolt-poly`, this could become a hard error in the future
warning: /home/benoit/JOLT/jolt/crates/jolt-prover-legacy/Cargo.toml: `default-features` is ignored for jolt-profiling, since `default-features` was not specified for `workspace.dependencies.jolt-profiling`, this could become a hard error in the future
warning: /home/benoit/JOLT/jolt/crates/jolt-prover/Cargo.toml: `default-features` is ignored for jolt-kernels, since `default-features` was not specified for `workspace.dependencies.jolt-kernels`, this could become a hard error in the future
warning: /home/benoit/JOLT/jolt/crates/jolt-prover/Cargo.toml: `default-features` is ignored for jolt-poly, since `default-features` was not specified for `workspace.dependencies.jolt-poly`, this could become a hard error in the future
warning: /home/benoit/JOLT/jolt/crates/jolt-prover/Cargo.toml: `default-features` is ignored for jolt-profiling, since `default-features` was not specified for `workspace.dependencies.jolt-profiling`, this could become a hard error in the future
warning: /home/benoit/JOLT/jolt/crates/jolt-prover/Cargo.toml: `default-features` is ignored for jolt-profiling, since `default-features` was not specified for `workspace.dependencies.jolt-profiling`, this could become a hard error in the future
    Finished `release` profile [optimized + debuginfo] target(s) in 0.28s
     Running `target/release/jolt-prover profile --name sha2-chain --scale 24 --backend cuda --format chrome`
2026-09-01T21:37:39.598268Z  INFO Starting MetricsMonitor — counter events are rewritten into Perfetto counter tracks at flush by summary::finalize_trace
2026-09-01T21:37:39.598331Z  INFO Running modular sha2-chain profile at scale 2^24
2026-09-01T21:37:39.598389Z  INFO Program::build_with_features: 
jolt build -p sha2-chain-guest --backtrace off --stack-size 4096 --heap-size 33554432 -- --release --target-dir /tmp/jolt-guest-targets/sha2-chain-guest- --features guest
2026-09-01T21:37:39.908310Z  INFO Program::build_with_features: Built guest binary with jolt: /tmp/jolt-guest-targets/sha2-chain-guest-/riscv64imac-unknown-none-elf/release/sha2-chain-guest
2026-09-01T21:37:40.101629Z  INFO JoltProverPreprocessing::new: Looking for saved setup at /home/benoit/.cache/dory/dory_28.urs
2026-09-01T21:37:45.422409Z  INFO JoltProverPreprocessing::new: Loaded setup for max_log_n=28
2026-09-01T21:37:58.224732Z  INFO jolt_prover::prove: stage_rss stage="prove_stage0" rss_open_gib=2.9476280212402344 rss_close_gib=3.076091766357422 trace_length=16777216
2026-09-01T21:38:00.770535Z  INFO jolt_prover::prove: stage_rss stage="prove_stage1" rss_open_gib=3.076091766357422 rss_close_gib=3.079021453857422 trace_length=16777216
2026-09-01T21:38:01.538244Z  INFO jolt_prover::prove: stage_rss stage="prove_stage2" rss_open_gib=3.079021453857422 rss_close_gib=3.079753875732422 trace_length=16777216
2026-09-01T21:38:02.251398Z  INFO jolt_prover::prove: stage_rss stage="prove_stage3" rss_open_gib=3.079753875732422 rss_close_gib=3.079875946044922 trace_length=16777216
2026-09-01T21:38:03.633736Z  INFO jolt_prover::prove: stage_rss stage="prove_stage4" rss_open_gib=3.079875946044922 rss_close_gib=3.079998016357422 trace_length=16777216
2026-09-01T21:38:06.976147Z  INFO jolt_prover::prove: stage_rss stage="prove_stage5" rss_open_gib=3.079998016357422 rss_close_gib=3.0805816650390625 trace_length=16777216
2026-09-01T21:38:08.215767Z  INFO jolt_prover::prove: stage_rss stage="prove_stage6a" rss_open_gib=3.0805816650390625 rss_close_gib=3.0807037353515625 trace_length=16777216
2026-09-01T21:38:10.918812Z  INFO jolt_prover::prove: stage_rss stage="prove_stage6b" rss_open_gib=3.0807037353515625 rss_close_gib=3.0816802978515625 trace_length=16777216
2026-09-01T21:38:11.673711Z  INFO jolt_prover::prove: stage_rss stage="prove_stage7" rss_open_gib=3.0816802978515625 rss_close_gib=3.0816802978515625 trace_length=16777216
2026-09-01T21:38:16.965456Z  INFO jolt_prover::prove: stage_rss stage="prove_stage8" rss_open_gib=3.0816802978515625 rss_close_gib=3.0832061767578125 trace_length=16777216
2026-09-01T21:38:16.966221Z  INFO stage_rss stage="jolt_prover::prove" rss_open_gib=2.9476280212402344 rss_close_gib=3.0832061767578125

thread 'main' (65335) panicked at crates/jolt-prover/src/profile.rs:619:6:
modular proof verifies: FinalOpeningVerificationFailed { reason: "opening proof verification failed" }
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
2026-09-01T21:38:17.243239Z  INFO MetricsMonitor stopping
$ nvidia-smi
Tue Sep  1 17:38:07 2026       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.00                 Driver Version: 580.00         CUDA Version: 13.0     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA Thor                    Off |   00000000:01:00.0 Off |                  N/A |
| N/A   40C  N/A              17W /  N/A  | Not Supported          |     98%      Default |
|                                         |                        |             Disabled |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A            3882      G   /usr/lib/xorg/Xorg                      287MiB |
|    0   N/A  N/A            4109      G   /usr/bin/gnome-shell                     94MiB |
|    0   N/A  N/A           65335      C   target/release/jolt-prover             7648MiB |
+-----------------------------------------------------------------------------------------+

@protoben

protoben commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator Author

@benoitrazet

JOLT_CUDA_POISON=1 RUST_LOG=info cargo run --release -p jolt-prover --features=profiling,cuda -- profile --name sha2-chain --scale 24 --backend cuda --format chrome
cargo nextest run -p jolt-kernels --features cuda cuda:: --cargo-quiet
cargo nextest run -p jolt-prover --features prover-fixtures,cuda --cargo-quiet

@benoitrazet

Copy link
Copy Markdown
Collaborator
$ JOLT_CUDA_POISON=1 RUST_LOG=info cargo run --release -p jolt-prover --features=profiling,cuda -- profile --name sha2-chain --scale 24 --backend cuda --format chromewarning: /home/benoit/JOLT/jolt/crates/jolt-prover-legacy/Cargo.toml: `default-features` is ignored for jolt-profiling, since `default-features` was not specified for `workspace.dependencies.jolt-profiling`, this could become a hard error in the future
warning: /home/benoit/JOLT/jolt/crates/jolt-kernels/Cargo.toml: `default-features` is ignored for jolt-poly, since `default-features` was not specified for `workspace.dependencies.jolt-poly`, this could become a hard error in the future
warning: /home/benoit/JOLT/jolt/crates/jolt-prover/Cargo.toml: `default-features` is ignored for jolt-kernels, since `default-features` was not specified for `workspace.dependencies.jolt-kernels`, this could become a hard error in the future
warning: /home/benoit/JOLT/jolt/crates/jolt-prover/Cargo.toml: `default-features` is ignored for jolt-poly, since `default-features` was not specified for `workspace.dependencies.jolt-poly`, this could become a hard error in the future
warning: /home/benoit/JOLT/jolt/crates/jolt-prover/Cargo.toml: `default-features` is ignored for jolt-profiling, since `default-features` was not specified for `workspace.dependencies.jolt-profiling`, this could become a hard error in the future
warning: /home/benoit/JOLT/jolt/crates/jolt-prover/Cargo.toml: `default-features` is ignored for jolt-profiling, since `default-features` was not specified for `workspace.dependencies.jolt-profiling`, this could become a hard error in the future
    Finished `release` profile [optimized + debuginfo] target(s) in 0.24s
     Running `target/release/jolt-prover profile --name sha2-chain --scale 24 --backend cuda --format chrome`
2026-09-01T21:54:38.692622Z  INFO Starting MetricsMonitor — counter events are rewritten into Perfetto counter tracks at flush by summary::finalize_trace
2026-09-01T21:54:38.692687Z  INFO Running modular sha2-chain profile at scale 2^24
2026-09-01T21:54:38.692751Z  INFO Program::build_with_features: 
jolt build -p sha2-chain-guest --backtrace off --stack-size 4096 --heap-size 33554432 -- --release --target-dir /tmp/jolt-guest-targets/sha2-chain-guest- --features guest
2026-09-01T21:54:39.008678Z  INFO Program::build_with_features: Built guest binary with jolt: /tmp/jolt-guest-targets/sha2-chain-guest-/riscv64imac-unknown-none-elf/release/sha2-chain-guest
2026-09-01T21:54:39.202222Z  INFO JoltProverPreprocessing::new: Looking for saved setup at /home/benoit/.cache/dory/dory_28.urs
2026-09-01T21:54:44.518748Z  INFO JoltProverPreprocessing::new: Loaded setup for max_log_n=28
2026-09-01T21:55:01.089713Z  INFO jolt_prover::prove: stage_rss stage="prove_stage0" rss_open_gib=2.9469451904296875 rss_close_gib=3.0742721557617188 trace_length=16777216
2026-09-01T21:55:04.567222Z  INFO jolt_prover::prove: stage_rss stage="prove_stage1" rss_open_gib=3.0742721557617188 rss_close_gib=3.0769577026367188 trace_length=16777216
2026-09-01T21:55:05.480166Z  INFO jolt_prover::prove: stage_rss stage="prove_stage2" rss_open_gib=3.0769577026367188 rss_close_gib=3.0780563354492188 trace_length=16777216
2026-09-01T21:55:06.253755Z  INFO jolt_prover::prove: stage_rss stage="prove_stage3" rss_open_gib=3.0780563354492188 rss_close_gib=3.0780563354492188 trace_length=16777216
2026-09-01T21:55:07.798870Z  INFO jolt_prover::prove: stage_rss stage="prove_stage4" rss_open_gib=3.0780563354492188 rss_close_gib=3.0780563354492188 trace_length=16777216
2026-09-01T21:55:11.593492Z  INFO jolt_prover::prove: stage_rss stage="prove_stage5" rss_open_gib=3.0780563354492188 rss_close_gib=3.07855224609375 trace_length=16777216
2026-09-01T21:55:13.026745Z  INFO jolt_prover::prove: stage_rss stage="prove_stage6a" rss_open_gib=3.07855224609375 rss_close_gib=3.07867431640625 trace_length=16777216
2026-09-01T21:55:16.606263Z  INFO jolt_prover::prove: stage_rss stage="prove_stage6b" rss_open_gib=3.07867431640625 rss_close_gib=3.07977294921875 trace_length=16777216
2026-09-01T21:55:17.678141Z  INFO jolt_prover::prove: stage_rss stage="prove_stage7" rss_open_gib=3.07977294921875 rss_close_gib=3.07977294921875 trace_length=16777216
2026-09-01T21:55:23.553164Z  INFO jolt_prover::prove: stage_rss stage="prove_stage8" rss_open_gib=3.07977294921875 rss_close_gib=3.0813980102539063 trace_length=16777216
2026-09-01T21:55:23.553830Z  INFO stage_rss stage="jolt_prover::prove" rss_open_gib=2.9469451904296875 rss_close_gib=3.0813980102539063

thread 'main' (10635) panicked at crates/jolt-prover/src/profile.rs:619:6:
modular proof verifies: FinalOpeningVerificationFailed { reason: "opening proof verification failed" }
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
2026-09-01T21:55:23.745759Z  INFO MetricsMonitor stopping

@benoitrazet

Copy link
Copy Markdown
Collaborator
$ cargo nextest run -p jolt-kernels --features cuda cuda:: --cargo-quiet
────────────                                                                                                                                                        Nextest run ID 588ab4dd-4bb9-4b34-a739-c938a29f7be0 with nextest profile: default                                                                                     Starting 359 tests across 1 binary (159 tests skipped)                                                                                                                 PASS [   0.005s] jolt-kernels cuda::advice_claim_reduction::tests::fixture_advice_columns_discriminate_the_two_kinds                                               PASS [   0.008s] jolt-kernels cuda::advice_claim_reduction::tests::fixture_advice_geometry_exercises_both_phases_and_both_round_kinds                              PASS [   0.008s] jolt-kernels cuda::booleanity::address::tests::fixture_one_hot_columns_are_not_blind                                                              PASS [   0.009s] jolt-kernels cuda::booleanity::address::tests::fixture_is_well_formed                                                                             PASS [   1.723s] jolt-kernels cuda::booleanity::masses::tests::booleanity_masses_reject_a_wrong_length_split_eq                                                    PASS [   0.019s] jolt-kernels cuda::booleanity::tests::fixture_booleanity_columns_are_one_hot_per_family                                                           PASS [   1.784s] jolt-kernels cuda::advice_claim_reduction::tests::trusted_advice_address_matches_reference_round_for_round                                        PASS [   1.846s] jolt-kernels cuda::booleanity::masses::tests::booleanity_masses_match_the_expanding_table_form_round_for_round                                    PASS [   0.008s] jolt-kernels cuda::bytecode_claim_reduction::tests::fixture_bytecode_chunks_and_weights_discriminate                                              PASS [   0.006s] jolt-kernels cuda::bytecode_claim_reduction::tests::fixture_bytecode_geometry_exercises_both_phases_and_both_permutation_branches                 PASS [   1.890s] jolt-kernels cuda::advice_claim_reduction::tests::trusted_advice_cycle_matches_reference_round_for_round                                          PASS [   0.010s] jolt-kernels cuda::bytecode_read_raf::address::tests::fixture_bytecode_pushforward_is_not_degenerate                                              PASS [   1.963s] jolt-kernels cuda::advice_claim_reduction::tests::untrusted_advice_cycle_matches_reference_round_for_round                                        PASS [   2.008s] jolt-kernels cuda::advice_claim_reduction::tests::untrusted_advice_address_matches_reference_round_for_round                                      PASS [   2.065s] jolt-kernels cuda::booleanity::one_hot::tests::device_booleanity_ra_matches_cpu_round_for_round                                                   PASS [   2.072s] jolt-kernels cuda::booleanity::address::tests::booleanity_address_matches_optimized_round_for_round                                               PASS [   0.004s] jolt-kernels cuda::bytecode_read_raf::pushforward::tests::bytecode_pushforward_carries_one_term_per_stage_plus_the_entry                          PASS [   2.093s] jolt-kernels cuda::booleanity::one_hot::tests::sharded_booleanity_ra_matches_the_whole_domain_round_for_round                                     PASS [   2.143s] jolt-kernels cuda::booleanity::address::tests::booleanity_address_matches_optimized_wide_chunk                                                    PASS [   0.008s] jolt-kernels cuda::bytecode_read_raf::tests::fixture_bytecode_chunks_span_the_production_width                                                    PASS [   2.172s] jolt-kernels cuda::booleanity::address::tests::booleanity_address_matches_optimized_single_cycle_round                                            PASS [   2.775s] jolt-kernels cuda::booleanity::tests::booleanity_cycle_matches_reference                                                                          PASS [   1.416s] jolt-kernels cuda::bytecode_read_raf::coefficient::tests::device_coefficient_matches_cpu_round_for_round                                          PASS [   1.572s] jolt-kernels cuda::bytecode_read_raf::address::tests::bytecode_read_raf_address_matches_optimized_round_for_round                                 PASS [   1.512s] jolt-kernels cuda::bytecode_read_raf::one_hot::tests::device_bytecode_ra_matches_cpu_round_for_round                                              PASS [   1.577s] jolt-kernels cuda::bytecode_read_raf::pushforward::tests::bytecode_pushforward_matches_the_separate_table_form_round_for_round                    PASS [   1.873s] jolt-kernels cuda::bytecode_claim_reduction::tests::bytecode_reduction_cycle_matches_reference_round_for_round                                    PASS [   1.667s] jolt-kernels cuda::bytecode_read_raf::pushforward::tests::bytecode_pushforward_rejects_a_short_stage_value_table                                  PASS [   0.006s] jolt-kernels cuda::commitment::tests::fixture_commit_configs_cover_every_reference_placement_branch                                               PASS [   0.008s] jolt-kernels cuda::commitment::tests::fixture_committed_columns_discriminate                                                                      PASS [   0.006s] jolt-kernels cuda::commitment::tests::the_increment_kernel_source_agrees_on_the_packed_layout                                                     PASS [   1.658s] jolt-kernels cuda::commitment::partition::tests::an_incremental_board_stitches_the_same_columns_in_any_arrival_order                              PASS [   1.847s] jolt-kernels cuda::bytecode_read_raf::one_hot::tests::sharded_bytecode_ra_matches_the_whole_domain_round_for_round                                PASS [   2.146s] jolt-kernels cuda::bytecode_claim_reduction::tests::bytecode_reduction_address_matches_reference_round_for_round                                  PASS [   1.774s] jolt-kernels cuda::commitment::partition::tests::cycle_windows_cover_the_domain_without_overlap                                                   PASS [   1.952s] jolt-kernels cuda::bytecode_read_raf::tests::bytecode_read_raf_cycle_matches_reference                                                            PASS [   2.132s] jolt-kernels cuda::commitment::partition::tests::pipelined_columns_match_reference_dory_under_skewed_arrival                                      PASS [   1.873s] jolt-kernels cuda::commitment::partition::tests::unaligned_or_undersized_domains_stay_whole                                                       PASS [   1.261s] jolt-kernels cuda::common::device_columns::tests::a_different_cycle_count_misses_without_evicting_its_neighbours                                  PASS [   1.714s] jolt-kernels cuda::commitment::tests::device_hot_columns_match_the_host_encoder                                                                   PASS [   1.586s] jolt-kernels cuda::common::address_major_matrix::tests::address_major_ram_message_matches_optimized_round_for_round                               PASS [   1.737s] jolt-kernels cuda::common::address_major_matrix::tests::address_major_ram_bind_matches_optimized_round_for_round                                  PASS [   1.676s] jolt-kernels cuda::common::dense_product::tests::sharded_dense_product_matches_the_whole_domain_round_for_round                                   PASS [   1.682s] jolt-kernels cuda::common::dense_product::tests::sharded_dense_product_matches_the_whole_domain_with_one_hot_and_lt                               PASS [   0.005s] jolt-kernels cuda::common::devices::tests::a_committed_plan_matches_the_witness_plan_whenever_the_rows_divide_it                                  PASS [   0.004s] jolt-kernels cuda::common::devices::tests::a_device_plan_splits_aligned_blocks_evenly_across_every_device_count                                   PASS [   0.005s] jolt-kernels cuda::common::devices::tests::a_witness_plan_declines_a_domain_too_small_or_unaligned_to_split                                       PASS [   0.010s] jolt-kernels cuda::common::devices::tests::a_witness_plan_splits_every_device_count_into_equal_power_of_two_windows                               PASS [   0.007s] jolt-kernels cuda::common::devices::tests::a_witness_plan_uses_the_largest_power_of_two_device_subset                                             PASS [   0.010s] jolt-kernels cuda::common::devices::tests::a_witness_window_carries_a_halo_on_every_boundary_but_the_last                                         PASS [   0.008s] jolt-kernels cuda::common::devices::tests::device_selections_cover_every_column_once_and_balance_rows                                             PASS [   2.045s] jolt-kernels cuda::commitment::tests::device_increment_columns_match_the_host_encoder                                                             PASS [   1.789s] jolt-kernels cuda::common::device_columns::tests::a_build_error_parks_nothing                                                                     PASS [   2.492s] jolt-kernels cuda::commitment::tests::commit_advice_matches_reference                                                                             PASS [   1.482s] jolt-kernels cuda::common::device_columns::tests::a_foreign_witness_clears_the_cabinet                                                            PASS [   1.661s] jolt-kernels cuda::common::device_columns::tests::a_second_ask_is_served_without_rebuilding                                                       PASS [   1.651s] jolt-kernels cuda::common::device_columns::tests::a_span_wider_than_the_asker_allows_is_not_served                                                PASS [   1.725s] jolt-kernels cuda::common::device_columns::tests::device_trace_columns_match_the_packed_host_columns                                              PASS [   1.878s] jolt-kernels cuda::common::device_columns::tests::a_switched_off_family_parks_nothing                                                             PASS [   1.740s] jolt-kernels cuda::common::device_columns::tests::fixture_arc_identity_proves_sharing_rather_than_equal_contents                                  PASS [   0.005s] jolt-kernels cuda::common::msm::tests::batch_affine_pairs_respect_the_distinct_x_precondition                                                     PASS [   1.739s] jolt-kernels cuda::common::half_fold::tests::half_fold_accumulates_over_columns_matching_cpu                                                      PASS [   1.685s] jolt-kernels cuda::common::half_fold::tests::half_fold_matches_cpu                                                                                PASS [   0.006s] jolt-kernels cuda::common::msm::tests::fixture_csr_geometries_cover_both_segment_kernels                                                          PASS [   0.005s] jolt-kernels cuda::common::msm::tests::fixture_msm_rows_and_one_hot_chunk_discriminate                                                            PASS [   1.953s] jolt-kernels cuda::common::device_columns::tests::each_window_of_a_column_is_its_own_entry                                                        PASS [   1.829s] jolt-kernels cuda::common::half_fold::tests::half_fold_axes_are_different_functions                                                               PASS [   1.891s] jolt-kernels cuda::common::half_fold::tests::narrow_half_fold_at_the_representation_extremes_matches_the_host_fold                                PASS [   1.976s] jolt-kernels cuda::common::half_fold::tests::strided_narrow_half_fold_matches_the_host_fold                                                       PASS [   1.623s] jolt-kernels cuda::common::lt_poly::tests::lt_windows_match_the_whole_domain_slice                                                                PASS [   2.527s] jolt-kernels cuda::common::half_fold::tests::narrow_half_fold_matches_the_host_fold                                                               PASS [   2.030s] jolt-kernels cuda::common::lt_poly::tests::lt_split_matches_dense_at_odd_and_even_widths                                                          PASS [   1.990s] jolt-kernels cuda::common::msm::tests::bucket_reduce_chunked_matches_arkworks                                                                     PASS [   2.040s] jolt-kernels cuda::common::msm::tests::fq_add_matches_arkworks                                                                                    PASS [   2.282s] jolt-kernels cuda::common::msm::tests::fq_mul_matches_arkworks                                                                                    PASS [   2.536s] jolt-kernels cuda::common::msm::tests::classed_segment_sums_match_the_block_kernel                                                                PASS [   2.500s] jolt-kernels cuda::common::msm::tests::fq_batch_inverse_matches_arkworks                                                                          PASS [   1.131s] jolt-kernels cuda::common::msm::tests::g1_add_matches_arkworks_at_special_cases                                                                   PASS [   1.288s] jolt-kernels cuda::common::msm::tests::g1_add_affine_matches_arkworks                                                                             PASS [   0.006s] jolt-kernels cuda::common::msm::tests::identity_limbs_read_back_as_the_group_identity                                                             PASS [   1.320s] jolt-kernels cuda::common::msm::tests::g1_add_matches_arkworks                                                                                    PASS [   2.481s] jolt-kernels cuda::common::msm::tests::fq_sub_matches_arkworks                                                                                    PASS [   1.239s] jolt-kernels cuda::common::msm::tests::g1_base_upload_round_trips                                                                                 PASS [   1.251s] jolt-kernels cuda::common::msm::tests::g1_double_matches_arkworks                                                                                 PASS [   1.501s] jolt-kernels cuda::common::msm::tests::g1_batch_add_affine_pairs_matches_arkworks                                                                 PASS [   4.235s] jolt-kernels cuda::common::lt_poly::tests::lt_coefficients_match_dense_binding                                                                    PASS [   1.452s] jolt-kernels cuda::common::msm::tests::glv_decompose_2d_matches_arkworks                                                                          PASS [   1.406s] jolt-kernels cuda::common::msm::tests::glv_decompose_4d_matches_arkworks                                                                          PASS [   1.499s] jolt-kernels cuda::common::msm::tests::msm_rows_fr_matches_arkworks                                                                               PASS [   0.005s] jolt-kernels cuda::common::msm::tests::special_pairs_cover_every_addition_branch                                                                  PASS [   0.005s] jolt-kernels cuda::common::msm::tests::the_shared_one_hot_histogram_covers_every_commitment_grid                                                  PASS [   1.665s] jolt-kernels cuda::common::msm::tests::msm_rows_i128_matches_arkworks                                                                             PASS [   1.612s] jolt-kernels cuda::common::msm::tests::one_hot_chunk_sums_matches_arkworks                                                                        PASS [   1.747s] jolt-kernels cuda::common::msm::tests::normalise_g1_span_matches_arkworks                                                                         PASS [   1.405s] jolt-kernels cuda::common::msm::tests::one_hot_rows_device_rejects_an_address_past_the_chunk                                                      PASS [   2.631s] jolt-kernels cuda::common::msm::tests::g1_endomorphism_span_matches_arkworks                                                                      PASS [   1.974s] jolt-kernels cuda::common::msm::tests::one_hot_rows_device_matches_the_host_csr                                                                   PASS [   1.542s] jolt-kernels cuda::common::msm::tests::one_hot_rows_matches_chunk_sums                                                                            PASS [   0.007s] jolt-kernels cuda::common::pack::tests::encode_address_maps_absent_to_cold_and_rejects_out_of_range                                               PASS [   0.006s] jolt-kernels cuda::common::pack::tests::pack_reports_the_smallest_rejected_address                                                                PASS [   0.008s] jolt-kernels cuda::common::pack::tests::pack_spans_more_than_one_chunk_and_keeps_row_order                                                        PASS [   1.799s] jolt-kernels cuda::common::msm::tests::resident_g1_msm_matches_arkworks                                                                           PASS [   1.863s] jolt-kernels cuda::common::msm::tests::resident_g2_msm_matches_arkworks                                                                           PASS [   1.811s] jolt-kernels cuda::common::msm::tests::the_shared_one_hot_histogram_declines_a_shape_it_cannot_hold                                               PASS [   1.484s] jolt-kernels cuda::common::msm::tests::window_fold_matches_arkworks                                                                               PASS [   0.009s] jolt-kernels cuda::common::prefix_suffix::tests::eq_pair_reproduces_the_dense_table_at_any_split                                                  PASS [   0.009s] jolt-kernels cuda::common::prefix_suffix::tests::eq_plus_one_pairs_match_the_host_decomposition                                                   PASS [   0.007s] jolt-kernels cuda::common::prefix_suffix::tests::eq_plus_one_pairs_reproduce_the_dense_table_at_any_split                                         PASS [   0.007s] jolt-kernels cuda::common::prefix_suffix::tests::eq_plus_one_table_is_the_shifted_eq_table                                                        PASS [   1.575s] jolt-kernels cuda::common::one_hot_fold::tests::affine_table_matches_cpu                                                                          PASS [   1.478s] jolt-kernels cuda::common::one_hot_fold::tests::hot_index_fold_matches_cpu_over_cold_cycles                                                       PASS [   1.357s] jolt-kernels cuda::common::one_hot_fold::tests::one_hot_cycle_fold_matches_cpu                                                                    PASS [   1.548s] jolt-kernels cuda::common::one_hot_fold::tests::windowed_folds_sum_to_the_whole_cycle_domain                                                      PASS [  10.833s] jolt-kernels cuda::commitment::tests::commit_witness_matches_reference                                                                            PASS [   2.510s] jolt-kernels cuda::common::msm::tests::warp_segment_sums_match_the_block_kernels                                                                  PASS [   1.991s] jolt-kernels cuda::common::pairing::tests::device_pairing_matches_arkworks                                                                        FAIL [   1.631s] jolt-kernels cuda::common::pairing::tests::multi_miller_above_the_warp_threshold_matches_arkworks                                           stdout ───                                                                                                                                                                                                                                                                                                                              running 1 test                                                                                                                                                     test cuda::common::pairing::tests::multi_miller_above_the_warp_threshold_matches_arkworks ... FAILED                                                                                                                                                                                                                                  failures:                                                                                                                                                                                                                                                                                                                             failures:                                                                                                                                                              cuda::common::pairing::tests::multi_miller_above_the_warp_threshold_matches_arkworks                                                                                                                                                                                                                                              test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 517 filtered out; finished in 1.53s                                                                                                                                                                                                                                 stderr ───                                                                                                                                                                                                                                                                                                                              thread 'cuda::common::pairing::tests::multi_miller_above_the_warp_threshold_matches_arkworks' (28624) panicked at crates/jolt-kernels/src/cuda/common/pairing.rs:523:13:                                                                                                                                                              assertion `left == right` failed: the Miller loop diverged for 257 pairs, above the warp threshold                                                                   left: QuadExtField { c0: CubicExtField { c0: QuadExtField { c0: 17437679005209368984889768588506335976149944714256791427109840598746714021281, c1: 2988012434222729627603723904656949149609707635260457795588048758863692610350 }, c1: QuadExtField { c0: 21024813929096994298796474380417440825927611744552816601744845893063533938877, c1: 18856360783258791026002003681499989857799367150329554830188599769963158756948 }, c2: QuadExtField { c0: 2744461861442872940081124396539689591718269710974975922082427463757156505286, c1: 16466313937125501116331527807572558348520607042554790455665532786528632408141 } }, c1: CubicExtField { c0: QuadExtField { c0: 12445941015097971647947688940155483991843613602324547584758613786571728816010, c1: 14465729221627540772108021108849857351579354639993213019363186303590593713560 }, c1: QuadExtField { c0: 6025954447498667956031281188492148209092146418993969511929325182630876012276, c1: 447745816895877815334144482194105818428651518642536209057426134527726722966 }, c2: QuadExtField { c0: 13700612374072522818890356700387394075824494653607158504741489026055197171109, c1: 4901092799445490676582443836030931842796797402236089559682066392336251301376 } } }                                                                                                                          right: QuadExtField { c0: CubicExtField { c0: QuadExtField { c0: 2270379808653589843944095374210554902989288341395849798315311765872317815269, c1: 1102746299629911667893089629538973412539566527721522860370059050580501304585 }, c1: QuadExtField { c0: 13860852934132086858589916730146142056985107987818900597268085977212835673325, c1: 9792099079401420624367510697237764616645559022510764131090075576229993923778 }, c2: QuadExtField { c0: 21015612287281951791187942879432457336203177604644434472957471029693516321681, c1: 21826667435444040234282842499195958816312894581707319489786159481949456317153 } }, c1: CubicExtField { c0: QuadExtField { c0: 12636903722976513392954457012336747410847328752981803754983843136160367843104, c1: 11231889305744749292679249832396029931526043120898752690394245253526039899434 }, c1: QuadExtField { c0: 20526794548411978099839383168098572956361427995743952830979373963624468120752, c1: 6795176081316424366350908795302498919075729435468469205418618142294469745345 }, c2: QuadExtField { c0: 1584947317646157438596516007149304192684328316869024384647050439119176101420, c1: 19970932900877833349637621497433106283911368849178530719871686169999591872436 } } }                                                                                                                        note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace                                                                                                                                                                                                                                                       Cancelling due to test failure: 11 tests still running                                                                                                                   PASS [   1.328s] jolt-kernels cuda::common::prefix_suffix::tests::two_group_prefix_suffix_matches_cpu_round_for_round                                              PASS [   1.505s] jolt-kernels cuda::common::prefix_suffix::tests::two_pair_prefix_suffix_matches_cpu_round_for_round                                               PASS [   1.683s] jolt-kernels cuda::common::prefix_suffix::tests::one_pair_prefix_suffix_matches_cpu_round_for_round                                               PASS [   1.850s] jolt-kernels cuda::common::pairing::tests::multi_miller_warp_segments_match_arkworks                                                              PASS [   2.001s] jolt-kernels cuda::common::pairing::tests::multi_miller_warp_matches_arkworks                                                                     PASS [   1.713s] jolt-kernels cuda::common::prefix_suffix::tests::windowed_prefix_suffix_matches_the_whole_domain_round_for_round                                  PASS [   1.210s] jolt-kernels cuda::common::primitives::tests::arithmetic_matches_cpu_at_modulus_boundaries                                                        PASS [   1.304s] jolt-kernels cuda::common::primitives::tests::add_scalar_matches_cpu                                                                              PASS [   1.431s] jolt-kernels cuda::common::primitives::tests::add_matches_cpu                                                                                     PASS [   1.030s] jolt-kernels cuda::common::primitives::tests::bind_high_to_low_matches_cpu                                                                        PASS [   6.227s] jolt-kernels cuda::common::msm::tests::g2_frobenius_span_matches_arkworks                                                                 ────────────                                                                                                                                                            Summary [  16.136s] 128/359 tests run: 127 passed, 1 failed, 159 skipped                                                                                              FAIL [   1.631s] jolt-kernels cuda::common::pairing::tests::multi_miller_above_the_warp_threshold_matches_arkworks                                         warning: 231/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

@benoitrazet

Copy link
Copy Markdown
Collaborator
        PASS [   1.991s] jolt-kernels cuda::common::pairing::tests::device_pairing_matches_arkworks                                                                        FAIL [   1.631s] jolt-kernels cuda::common::pairing::tests::multi_miller_above_the_warp_threshold_matches_arkworks                                           stdout ───                                                                                                                                                                                                                                                                                                                              running 1 test                                                                                                                                                     test cuda::common::pairing::tests::multi_miller_above_the_warp_threshold_matches_arkworks ... FAILED                                                                                                                                                                                                                                  failures:                                                                                                                                                                                                                                                                                                                             failures:                                                                                                                                                              cuda::common::pairing::tests::multi_miller_above_the_warp_threshold_matches_arkworks                                                                                                                                                                                                                                              test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 517 filtered out; finished in 1.53s                                                                                                                                                                                                                                 stderr ───                                                                                                                                                                                                                                                                                                                              thread 'cuda::common::pairing::tests::multi_miller_above_the_warp_threshold_matches_arkworks' (28624) panicked at crates/jolt-kernels/src/cuda/common/pairing.rs:523:13:                                                                                                                                                              assertion `left == right` failed: the Miller loop diverged for 257 pairs, above the warp threshold                                                                   left: QuadExtField { c0: CubicExtField { c0: QuadExtField { c0: 17437679005209368984889768588506335976149944714256791427109840598746714021281, c1: 2988012434222729627603723904656949149609707635260457795588048758863692610350 }, c1: QuadExtField { c0: 21024813929096994298796474380417440825927611744552816601744845893063533938877, c1: 18856360783258791026002003681499989857799367150329554830188599769963158756948 }, c2: QuadExtField { c0: 2744461861442872940081124396539689591718269710974975922082427463757156505286, c1: 16466313937125501116331527807572558348520607042554790455665532786528632408141 } }, c1: CubicExtField { c0: QuadExtField { c0: 12445941015097971647947688940155483991843613602324547584758613786571728816010, c1: 14465729221627540772108021108849857351579354639993213019363186303590593713560 }, c1: QuadExtField { c0: 6025954447498667956031281188492148209092146418993969511929325182630876012276, c1: 447745816895877815334144482194105818428651518642536209057426134527726722966 }, c2: QuadExtField { c0: 13700612374072522818890356700387394075824494653607158504741489026055197171109, c1: 4901092799445490676582443836030931842796797402236089559682066392336251301376 } } }                                                                                                                          right: QuadExtField { c0: CubicExtField { c0: QuadExtField { c0: 2270379808653589843944095374210554902989288341395849798315311765872317815269, c1: 1102746299629911667893089629538973412539566527721522860370059050580501304585 }, c1: QuadExtField { c0: 13860852934132086858589916730146142056985107987818900597268085977212835673325, c1: 9792099079401420624367510697237764616645559022510764131090075576229993923778 }, c2: QuadExtField { c0: 21015612287281951791187942879432457336203177604644434472957471029693516321681, c1: 21826667435444040234282842499195958816312894581707319489786159481949456317153 } }, c1: CubicExtField { c0: QuadExtField { c0: 12636903722976513392954457012336747410847328752981803754983843136160367843104, c1: 11231889305744749292679249832396029931526043120898752690394245253526039899434 }, c1: QuadExtField { c0: 20526794548411978099839383168098572956361427995743952830979373963624468120752, c1: 6795176081316424366350908795302498919075729435468469205418618142294469745345 }, c2: QuadExtField { c0: 1584947317646157438596516007149304192684328316869024384647050439119176101420, c1: 19970932900877833349637621497433106283911368849178530719871686169999591872436 } } }                                                                                                                        note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace                                                                                                                                                                                                                                                       Cancelling due to test failure: 11 tests still running                                                                                                                   PASS [   1.328s] jolt-kernels cuda::common::prefix_suffix::tests::two_group_prefix_suffix_matches_cpu_round_for_round                                              PASS [   1.505s] jolt-kernels cuda::common::prefix_suffix::tests::two_pair_prefix_suffix_matches_cpu_round_for_round                                               PASS [   1.683s] jolt-kernels cuda::common::prefix_suffix::tests::one_pair_prefix_suffix_matches_cpu_round_for_round                                               PASS [   1.850s] jolt-kernels cuda::common::pairing::tests::multi_miller_warp_segments_match_arkworks                                                              PASS [   2.001s] jolt-kernels cuda::common::pairing::tests::multi_miller_warp_matches_arkworks                                                                     PASS [   1.713s] jolt-kernels cuda::common::prefix_suffix::tests::windowed_prefix_suffix_matches_the_whole_domain_round_for_round                                  PASS [   1.210s] jolt-kernels cuda::common::primitives::tests::arithmetic_matches_cpu_at_modulus_boundaries                                                        PASS [   1.304s] jolt-kernels cuda::common::primitives::tests::add_scalar_matches_cpu                                                                              PASS [   1.431s] jolt-kernels cuda::common::primitives::tests::add_matches_cpu                                                                                     PASS [   1.030s] jolt-kernels cuda::common::primitives::tests::bind_high_to_low_matches_cpu                                                                        PASS [   6.227s] jolt-kernels cuda::common::msm::tests::g2_frobenius_span_matches_arkworks                                                                 ────────────                                                                                                                                                            Summary [  16.136s] 128/359 tests run: 127 passed, 1 failed, 159 skipped                                                                                              FAIL [   1.631s] jolt-kernels cuda::common::pairing::tests::multi_miller_above_the_warp_threshold_matches_arkworks                                         warning: 231/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

@benoitrazet

Copy link
Copy Markdown
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

@benoitrazet

Copy link
Copy Markdown
Collaborator
Screenshot from 2026-09-01 18-07-55

@benoitrazet

Copy link
Copy Markdown
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

@benoitrazet

Copy link
Copy Markdown
Collaborator
Screenshot from 2026-09-01 18-22-00

@benoitrazet

Copy link
Copy Markdown
Collaborator

nextest_output.txt
I'm attaching the output of nextest using the latest commits

@benoitrazet

Copy link
Copy Markdown
Collaborator

fix_for_thor.md

@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.

protoben and others added 18 commits October 26, 2026 16:55
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>
0xAndoroid and others added 30 commits November 5, 2026 14:22
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

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.