Skip to content

Update Aiur to Plonky3 0.6 - #605

Merged
arthurpaulino merged 6 commits into
mainfrom
ap/bump-p3
Sep 2, 2026
Merged

Update Aiur to Plonky3 0.6#605
arthurpaulino merged 6 commits into
mainfrom
ap/bump-p3

Conversation

@arthurpaulino

Copy link
Copy Markdown
Member

Update the multi-stark dependency and Rust toolchain for Plonky3 0.6, along with the Rust 1.98 lint migrations required to keep the workspace warning-free. Refresh the Rust-compatible Blake3.lean pin in both root and compile-package manifests.

Adapt recursive Aiur verification to Plonky3's pruned FRI multiproofs. Native proofs retain their compact serialized representation and native verification path; the FFI expands authenticated Merkle frontiers into per-query advice only when entering the existing recursive verifier circuit.

Preserve the packed claim-digest convention in the recursion diagnostic and exercise the advice boundary in the end-to-end test and benchmark paths. CPU and CUDA recursive q1 runs produce identical 823,485-byte inner proofs and 331,273-byte outer proofs.

The q50 Vector.extract_append workload retains identical CPU/CUDA proof sizes. Inner plus outer STARK proving measures 65.87s on CPU and 8.81s with CUDA on the RTX PRO 6000, a 7.48x speedup.

@arthurpaulino

Copy link
Copy Markdown
Member Author

!benchmark fresh

@argument-ci-bot

argument-ci-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

!benchmark — main vs eab18e4

backends: aiur=prove · envs: InitStd · baseline: fresh (benchmark products rebuilt, base-SHA run, bencher bypassed)

aiur · InitStd · prove — main from: base run @ e1ca8e2 (fresh — bencher bypassed)

7 constants · 1 with regressions · 7 with improvements (|Δ| > 3.0% on any metric).

IxVM on FRI (7 constants)
constant execute-time (main) execute-time (PR) Δ% prove-time (main) prove-time (PR) Δ% throughput (const/s) (main) throughput (const/s) (PR) Δ% peak-ram (main) peak-ram (PR) Δ% proof-size (main) proof-size (PR) Δ% verify-time (main) verify-time (PR) Δ% fft-cost (main) fft-cost (PR) Δ%
ByteArray.utf8DecodeChar?_utf8EncodeChar_append 8.816 s 8.990 s +2.0% 30.095 s 29.094 s -3.3% 🟢 92.210 95.380 +3.4% 🟢 70.72 GiB 72.35 GiB +2.3% 11.33 MiB 11.07 MiB -2.3% 68.7 ms 60.4 ms -12.1% (1.14× faster) 🟢 134.35B 134.35B +0.0%
Char.ofOrdinal_le_of_le 6.689 s 6.790 s +1.5% 25.631 s 25.209 s -1.6% 107.800 109.600 +1.7% 63.87 GiB 65.41 GiB +2.4% 11.33 MiB 11.07 MiB -2.3% 73.7 ms 60.3 ms -18.2% (1.22× faster) 🟢 102.60B 102.60B +0.0%
Array.extract_append 6.679 s 6.415 s -4.0% 🟢 23.076 s 22.072 s -4.4% 🟢 69.600 72.760 +4.5% 🟢 52.03 GiB 52.79 GiB +1.4% 11.24 MiB 10.99 MiB -2.2% 72.3 ms 64.6 ms -10.6% (1.12× faster) 🟢 97.08B 97.08B +0.0%
Std.HashMap 3.964 s 4.002 s +1.0% 15.519 s 15.133 s -2.5% 131.580 134.940 +2.6% 36.34 GiB 37.08 GiB +2.1% 11.26 MiB 11.00 MiB -2.3% 75.1 ms 65.5 ms -12.8% (1.15× faster) 🟢 61.88B 61.88B +0.0%
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq 3.598 s 3.528 s -1.9% 14.327 s 13.806 s -3.6% 🟢 130.310 135.230 +3.8% 🟢 33.96 GiB 34.69 GiB +2.1% 11.26 MiB 11.01 MiB -2.2% 69.9 ms 59.5 ms -15.0% (1.18× faster) 🟢 55.68B 55.68B +0.0%
String.append 424.3 ms 423.0 ms -0.3% 2.278 s 2.124 s -6.7% (1.07× faster) 🟢 143.540 153.930 +7.2% (1.07× faster) 🟢 4.89 GiB 5.00 GiB +2.4% 9.94 MiB 9.74 MiB -2.0% 64.2 ms 52.0 ms -19.0% (1.24× faster) 🟢 3.37B 3.37B +0.0%
Nat.add_comm 260.1 ms 259.8 ms -0.1% 1.068 s 970.5 ms -9.1% (1.10× faster) 🟢 43.070 47.400 +10.1% (1.10× faster) 🟢 3.99 GiB 4.64 GiB +16.4% (1.16× larger) ⚠️ 9.09 MiB 8.91 MiB -2.0% 53.9 ms 41.9 ms -22.3% (1.29× faster) 🟢 308.40M 308.40M +0.0%
FRI verifier on FRI (7 constants)
constant execute-time (main) execute-time (PR) Δ% prove-time (main) prove-time (PR) Δ% throughput (const/s) (main) throughput (const/s) (PR) Δ% peak-ram (main) peak-ram (PR) Δ% proof-size (main) proof-size (PR) Δ% verify-time (main) verify-time (PR) Δ% fft-cost (main) fft-cost (PR) Δ%
ByteArray.utf8DecodeChar?_utf8EncodeChar_append 5.488 s 5.490 s +0.0% 31.664 s 30.699 s -3.0% 🟢 87.640 90.400 +3.1% 🟢 101.37 GiB 101.07 GiB -0.3% 3.97 MiB 3.72 MiB -6.3% (1.07× smaller) 🟢 29.2 ms 23.8 ms -18.5% (1.23× faster) 🟢 210.23B 210.23B +0.0%
Char.ofOrdinal_le_of_le 5.386 s 5.489 s +1.9% 30.846 s 30.914 s +0.2% 89.570 89.380 -0.2% 100.32 GiB 100.32 GiB +0.0% 3.97 MiB 3.72 MiB -6.3% (1.07× smaller) 🟢 24.8 ms 23.1 ms -6.6% (1.07× faster) 🟢 207.18B 207.18B +0.0%
Array.extract_append 5.209 s 5.235 s +0.5% 29.948 s 28.844 s -3.7% 🟢 53.630 55.680 +3.8% 🟢 94.59 GiB 95.37 GiB +0.8% 3.97 MiB 3.73 MiB -6.1% (1.07× smaller) 🟢 25.7 ms 21.3 ms -17.1% (1.21× faster) 🟢 200.65B 200.65B +0.0%
Std.HashMap 5.314 s 5.306 s -0.1% 29.652 s 29.584 s -0.2% 68.870 69.020 +0.2% 94.56 GiB 95.34 GiB +0.8% 3.97 MiB 3.72 MiB -6.3% (1.07× smaller) 🟢 25.2 ms 21.2 ms -15.7% (1.19× faster) 🟢 203.35B 203.35B +0.0%
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq 5.400 s 5.333 s -1.2% 31.051 s 30.174 s -2.8% 60.130 61.870 +2.9% 98.68 GiB 99.48 GiB +0.8% 3.97 MiB 3.73 MiB -6.2% (1.07× smaller) 🟢 30.2 ms 31.0 ms +2.5% 205.59B 205.59B +0.0%
String.append 4.334 s 4.419 s +2.0% 27.489 s 26.612 s -3.2% 🟢 11.900 12.290 +3.3% 🟢 87.87 GiB 88.58 GiB +0.8% 3.97 MiB 3.73 MiB -6.1% (1.07× smaller) 🟢 34.5 ms 22.7 ms -34.3% (1.52× faster) 🟢 168.67B 168.67B +0.0%
Nat.add_comm 3.518 s 3.499 s -0.5% 18.993 s 17.942 s -5.5% (1.06× faster) 🟢 2.420 2.560 +5.8% (1.06× faster) 🟢 58.70 GiB 59.42 GiB +1.2% 3.97 MiB 3.72 MiB -6.2% (1.07× smaller) 🟢 24.8 ms 20.8 ms -16.1% (1.19× faster) 🟢 130.84B 130.84B +0.0%
Pipeline total (7 constants)
constant total-time (main) total-time (PR) Δ% pipeline-throughput (const/s) (main) pipeline-throughput (const/s) (PR) Δ% pipeline-peak-ram (main) pipeline-peak-ram (PR) Δ%
ByteArray.utf8DecodeChar?_utf8EncodeChar_append 1m 1.8s 59.792 s -3.2% 🟢 44.930 46.410 +3.3% 🟢 101.37 GiB 101.07 GiB -0.3%
Char.ofOrdinal_le_of_le 56.477 s 56.124 s -0.6% 48.920 49.230 +0.6% 100.32 GiB 100.32 GiB +0.0%
Array.extract_append 53.024 s 50.916 s -4.0% 🟢 30.290 31.540 +4.1% 🟢 94.59 GiB 95.37 GiB +0.8%
Std.HashMap 45.172 s 44.717 s -1.0% 45.210 45.660 +1.0% 94.56 GiB 95.34 GiB +0.8%
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq 45.377 s 43.980 s -3.1% 🟢 41.140 42.450 +3.2% 🟢 98.68 GiB 99.48 GiB +0.8%
String.append 29.767 s 28.737 s -3.5% 🟢 10.990 11.380 +3.5% 🟢 87.87 GiB 88.58 GiB +0.8%
Nat.add_comm 20.061 s 18.912 s -5.7% (1.06× faster) 🟢 2.290 2.430 +6.1% (1.06× faster) 🟢 58.70 GiB 59.42 GiB +1.2%

Workflow logs

@arthurpaulino

Copy link
Copy Markdown
Member Author

!benchmark fresh

@argument-ci-bot

argument-ci-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

!benchmark — main vs 840932a

backends: aiur=prove · envs: InitStd · baseline: fresh (benchmark products rebuilt, base-SHA run, bencher bypassed)

Warning

  • CPU model mismatch for PR benchmark binaries in this job: built on AMD EPYC 9R45; measured on Intel(R) Xeon(R) 6975P-C. Native Rust code uses -Ctarget-cpu=native.

aiur · InitStd · prove — main from: base run @ e1ca8e2 (fresh — bencher bypassed)

7 constants · 0 with regressions · 0 with improvements (|Δ| > 3.0% on any metric).

IxVM on FRI (7 constants)
constant execute-time (main) execute-time (PR) Δ% prove-time (main) prove-time (PR) Δ% throughput (const/s) (main) throughput (const/s) (PR) Δ% peak-ram (main) peak-ram (PR) Δ% proof-size (main) proof-size (PR) Δ% verify-time (main) verify-time (PR) Δ% fft-cost (main) fft-cost (PR) Δ%
ByteArray.utf8DecodeChar?_utf8EncodeChar_append 8.874 s 💥 CRASH n/a 44.291 s 💥 CRASH n/a 62.650 💥 CRASH n/a 70.80 GiB 💥 CRASH n/a 11.33 MiB 💥 CRASH n/a 77.4 ms 💥 CRASH n/a 134.35B 💥 CRASH n/a
Char.ofOrdinal_le_of_le 6.603 s 💥 CRASH n/a 38.242 s 💥 CRASH n/a 72.250 💥 CRASH n/a 63.81 GiB 💥 CRASH n/a 11.33 MiB 💥 CRASH n/a 76.9 ms 💥 CRASH n/a 102.60B 💥 CRASH n/a
Array.extract_append 6.311 s 💥 CRASH n/a 33.420 s 💥 CRASH n/a 48.060 💥 CRASH n/a 51.95 GiB 💥 CRASH n/a 11.24 MiB 💥 CRASH n/a 86.5 ms 💥 CRASH n/a 97.08B 💥 CRASH n/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq 3.774 s 💥 CRASH n/a 20.628 s 💥 CRASH n/a 90.510 💥 CRASH n/a 33.97 GiB 💥 CRASH n/a 11.26 MiB 💥 CRASH n/a 82.6 ms 💥 CRASH n/a 55.68B 💥 CRASH n/a
Std.HashMap 4.060 s 💥 CRASH n/a 22.501 s 💥 CRASH n/a 90.750 💥 CRASH n/a 36.36 GiB 💥 CRASH n/a 11.26 MiB 💥 CRASH n/a 84.1 ms 💥 CRASH n/a 61.88B 💥 CRASH n/a
String.append 708.3 ms 💥 CRASH n/a 2.863 s 💥 CRASH n/a 114.220 💥 CRASH n/a 4.99 GiB 💥 CRASH n/a 9.94 MiB 💥 CRASH n/a 70.3 ms 💥 CRASH n/a 3.37B 💥 CRASH n/a
Nat.add_comm 496.0 ms 💥 CRASH n/a 1.330 s 💥 CRASH n/a 34.580 💥 CRASH n/a 4.33 GiB 💥 CRASH n/a 9.09 MiB 💥 CRASH n/a 58.9 ms 💥 CRASH n/a 308.40M 💥 CRASH n/a
FRI verifier on FRI (7 constants)
constant execute-time (main) execute-time (PR) Δ% prove-time (main) prove-time (PR) Δ% throughput (const/s) (main) throughput (const/s) (PR) Δ% peak-ram (main) peak-ram (PR) Δ% proof-size (main) proof-size (PR) Δ% verify-time (main) verify-time (PR) Δ% fft-cost (main) fft-cost (PR) Δ%
ByteArray.utf8DecodeChar?_utf8EncodeChar_append 6.880 s 💥 CRASH n/a 54.265 s 💥 CRASH n/a 51.140 💥 CRASH n/a 101.05 GiB 💥 CRASH n/a 3.97 MiB 💥 CRASH n/a 49.5 ms 💥 CRASH n/a 210.23B 💥 CRASH n/a
Char.ofOrdinal_le_of_le 6.813 s 💥 CRASH n/a 53.449 s 💥 CRASH n/a 51.690 💥 CRASH n/a 99.81 GiB 💥 CRASH n/a 3.97 MiB 💥 CRASH n/a 45.1 ms 💥 CRASH n/a 207.18B 💥 CRASH n/a
Array.extract_append 6.371 s 💥 CRASH n/a 50.695 s 💥 CRASH n/a 31.680 💥 CRASH n/a 95.19 GiB 💥 CRASH n/a 3.97 MiB 💥 CRASH n/a 58.1 ms 💥 CRASH n/a 200.65B 💥 CRASH n/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq 6.748 s 💥 CRASH n/a 53.378 s 💥 CRASH n/a 34.980 💥 CRASH n/a 98.71 GiB 💥 CRASH n/a 3.97 MiB 💥 CRASH n/a 46.1 ms 💥 CRASH n/a 205.59B 💥 CRASH n/a
Std.HashMap 6.455 s 💥 CRASH n/a 50.868 s 💥 CRASH n/a 40.140 💥 CRASH n/a 95.03 GiB 💥 CRASH n/a 3.97 MiB 💥 CRASH n/a 45.7 ms 💥 CRASH n/a 203.35B 💥 CRASH n/a
String.append 5.307 s 💥 CRASH n/a 47.595 s 💥 CRASH n/a 6.870 💥 CRASH n/a 87.89 GiB 💥 CRASH n/a 3.97 MiB 💥 CRASH n/a 32.4 ms 💥 CRASH n/a 168.67B 💥 CRASH n/a
Nat.add_comm 4.526 s 💥 CRASH n/a 31.415 s 💥 CRASH n/a 1.460 💥 CRASH n/a 58.66 GiB 💥 CRASH n/a 3.97 MiB 💥 CRASH n/a 28.0 ms 💥 CRASH n/a 130.84B 💥 CRASH n/a
Pipeline total (7 constants)
constant total-time (main) total-time (PR) Δ% pipeline-throughput (const/s) (main) pipeline-throughput (const/s) (PR) Δ% pipeline-peak-ram (main) pipeline-peak-ram (PR) Δ%
ByteArray.utf8DecodeChar?_utf8EncodeChar_append 1m 38.6s 💥 CRASH n/a 28.160 💥 CRASH n/a 101.05 GiB 💥 CRASH n/a
Char.ofOrdinal_le_of_le 1m 31.7s 💥 CRASH n/a 30.130 💥 CRASH n/a 99.81 GiB 💥 CRASH n/a
Array.extract_append 1m 24.1s 💥 CRASH n/a 19.090 💥 CRASH n/a 95.19 GiB 💥 CRASH n/a
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq 1m 14.0s 💥 CRASH n/a 25.230 💥 CRASH n/a 98.71 GiB 💥 CRASH n/a
Std.HashMap 1m 13.4s 💥 CRASH n/a 27.830 💥 CRASH n/a 95.03 GiB 💥 CRASH n/a
String.append 50.458 s 💥 CRASH n/a 6.480 💥 CRASH n/a 87.89 GiB 💥 CRASH n/a
Nat.add_comm 32.745 s 💥 CRASH n/a 1.400 💥 CRASH n/a 58.66 GiB 💥 CRASH n/a

Workflow logs

samuelburnham added a commit that referenced this pull request Sep 1, 2026
The Warp x64 runner pool mixes Intel Granite Rapids and AMD Zen 5, and a
build job may land on one vendor while the job that runs its binaries
lands on the other. Neither vendor's feature set contains the other's, so
`-Ctarget-cpu=native` does not produce a portable binary: Zen 5 enables
SSE4A, and LLVM emits it. Disassembling the workspace built for znver5
finds 31 SSE4A instructions, all INSERTQ, in `ix-ffi` and in
`aiur_ixvm_witness::add_entries_parallel`. Granite Rapids has no SSE4A,
so the first one executed raises #UD, killing the process with SIGILL
during witness generation. That is what turned every row of #605's
benchmark into a crash.

Pin the measured intersection of the two CPUs instead. x86-64-v4 covers
every AVX-512 subset Plonky3 uses; +avx512vbmi2 preserves its VPSHRDQ
interleave and +gfni preserves LLVM's byte-shift lowering. A workspace
built with these flags contains no instruction absent from either vendor
and has an instruction vocabulary identical to a graniterapids build.
blake3 dispatches on CPUID at runtime and is unaffected either way.

`.cargo/config.toml` keeps `-Ctarget-cpu=native`: a developer builds and
runs on one machine, and x86-64-v4 would exclude every host without
AVX-512. Only CI has the split, so only CI pins the ISA. The new guard
fails the job when a runner lacks a required feature, so the assumption
is enforced rather than assumed, and the shared `warp-x64` cargo cache
key becomes sound now that codegen no longer varies by host.

Pinning also removes a benchmarking hazard that never crashed: LLVM sets
prefer-256-bit for Granite Rapids but not for Zen 5, so the same source
vectorized 3.2x more widely depending on the build host, and main-vs-PR
timings were not comparable across a vendor split.

Drop the CPU-mismatch warning the benchmark comment used to carry. It
detected a real problem, but the flags above prevent that problem, and
computing it in one job to render it in another cost a Markdown file
threaded through cache entries, artifacts, and a `--warning-file` flag on
`ix bench compare`. Warnings belong to the run that finds them.
@arthurpaulino

Copy link
Copy Markdown
Member Author

!benchmark fresh

@argument-ci-bot

argument-ci-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

⚠️ Some benchmark jobs failed — results may be partial.

!benchmark — main vs d7fc2f1

backends: aiur=prove · envs: InitStd · baseline: fresh (benchmark products rebuilt, base-SHA run, bencher bypassed)

No result tables were produced — see the run logs.

Workflow logs

samuelburnham added a commit that referenced this pull request Sep 1, 2026
The Warp x64 runner pool mixes Intel Granite Rapids and AMD Zen 5, and a
build job may land on one vendor while the job that runs its binaries
lands on the other. Neither vendor's feature set contains the other's, so
`-Ctarget-cpu=native` does not produce a portable binary: Zen 5 enables
SSE4A, and LLVM emits it. Disassembling the workspace built for znver5
finds 31 SSE4A instructions, all INSERTQ, in `ix-ffi` and in
`aiur_ixvm_witness::add_entries_parallel`. Granite Rapids has no SSE4A,
so the first one executed raises #UD, killing the process with SIGILL
during witness generation. That is what turned every row of #605's
benchmark into a crash.

Pin the measured intersection of the two CPUs instead. x86-64-v4 covers
every AVX-512 subset Plonky3 uses; +avx512vbmi2 preserves its VPSHRDQ
interleave and +gfni preserves LLVM's byte-shift lowering. A workspace
built with these flags contains no instruction absent from either vendor
and has an instruction vocabulary identical to a graniterapids build.
blake3 dispatches on CPUID at runtime and is unaffected either way.

`.cargo/config.toml` keeps `-Ctarget-cpu=native`: a developer builds and
runs on one machine, and x86-64-v4 would exclude every host without
AVX-512. Only CI has the split, so only CI pins the ISA. The new guard
fails the job when a runner lacks a required feature, so the assumption
is enforced rather than assumed, and the shared `warp-x64` cargo cache
key becomes sound now that codegen no longer varies by host. RUSTFLAGS
is hashed into that key, so the flag change rotates it on its own.

Pinning also removes a benchmarking hazard that never crashed: LLVM sets
prefer-256-bit for Granite Rapids but not for Zen 5, so the same source
vectorized 3.2x more widely depending on the build host, and main-vs-PR
timings were not comparable across a vendor split.
@samuelburnham

Copy link
Copy Markdown
Member

!benchmark fresh

@argument-ci-bot

argument-ci-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

!benchmark — main vs feb014d

backends: aiur=prove · envs: InitStd · baseline: fresh (benchmark products rebuilt, base-SHA run, bencher bypassed)

aiur · InitStd · prove — main from: base run @ e1ca8e2 (fresh — bencher bypassed)

7 constants · 3 with regressions · 7 with improvements (|Δ| > 3.0% on any metric).

IxVM on FRI (7 constants)
constant execute-time (main) execute-time (PR) Δ% prove-time (main) prove-time (PR) Δ% throughput (const/s) (main) throughput (const/s) (PR) Δ% peak-ram (main) peak-ram (PR) Δ% proof-size (main) proof-size (PR) Δ% verify-time (main) verify-time (PR) Δ% fft-cost (main) fft-cost (PR) Δ%
ByteArray.utf8DecodeChar?_utf8EncodeChar_append 9.269 s 9.073 s -2.1% 31.250 s 30.269 s -3.1% 🟢 88.800 91.680 +3.2% 🟢 70.72 GiB 72.28 GiB +2.2% 11.33 MiB 11.06 MiB -2.4% 68.5 ms 62.7 ms -8.5% (1.09× faster) 🟢 134.35B 134.35B +0.0%
Char.ofOrdinal_le_of_le 6.964 s 6.879 s -1.2% 26.884 s 25.793 s -4.1% 🟢 102.780 107.120 +4.2% 🟢 63.83 GiB 65.31 GiB +2.3% 11.33 MiB 11.07 MiB -2.3% 77.9 ms 59.3 ms -23.8% (1.31× faster) 🟢 102.60B 102.60B +0.0%
Array.extract_append 6.676 s 6.751 s +1.1% 23.925 s 23.179 s -3.1% 🟢 67.130 69.290 +3.2% 🟢 51.97 GiB 52.72 GiB +1.4% 11.24 MiB 10.99 MiB -2.2% 71.1 ms 57.2 ms -19.5% (1.24× faster) 🟢 97.08B 97.08B +0.0%
Std.HashMap 4.171 s 4.079 s -2.2% 16.222 s 15.628 s -3.7% 🟢 125.880 130.670 +3.8% 🟢 36.29 GiB 37.10 GiB +2.2% 11.26 MiB 11.01 MiB -2.2% 74.8 ms 66.6 ms -11.0% (1.12× faster) 🟢 61.88B 61.88B +0.0%
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq 3.697 s 3.648 s -1.3% 14.858 s 14.287 s -3.8% 🟢 125.650 130.680 +4.0% 🟢 34.02 GiB 34.75 GiB +2.1% 11.26 MiB 11.00 MiB -2.2% 75.5 ms 57.7 ms -23.6% (1.31× faster) 🟢 55.68B 55.68B +0.0%
String.append 435.5 ms 434.0 ms -0.4% 2.307 s 2.129 s -7.7% (1.08× faster) 🟢 141.750 153.600 +8.4% (1.08× faster) 🟢 5.74 GiB 5.52 GiB -3.9% 🟢 9.94 MiB 9.74 MiB -2.1% 64.4 ms 50.2 ms -22.1% (1.28× faster) 🟢 3.37B 3.37B +0.0%
Nat.add_comm 267.1 ms 264.3 ms -1.1% 1.068 s 984.9 ms -7.8% (1.08× faster) 🟢 43.060 46.710 +8.5% (1.08× faster) 🟢 4.51 GiB 3.99 GiB -11.5% (1.13× smaller) 🟢 9.09 MiB 8.90 MiB -2.1% 53.3 ms 47.9 ms -10.2% (1.11× faster) 🟢 308.40M 308.40M +0.0%
FRI verifier on FRI (7 constants)
constant execute-time (main) execute-time (PR) Δ% prove-time (main) prove-time (PR) Δ% throughput (const/s) (main) throughput (const/s) (PR) Δ% peak-ram (main) peak-ram (PR) Δ% proof-size (main) proof-size (PR) Δ% verify-time (main) verify-time (PR) Δ% fft-cost (main) fft-cost (PR) Δ%
ByteArray.utf8DecodeChar?_utf8EncodeChar_append 5.680 s 4.975 s -12.4% (1.14× faster) 🟢 33.109 s 30.692 s -7.3% (1.08× faster) 🟢 83.820 90.410 +7.9% (1.08× faster) 🟢 101.44 GiB 99.74 GiB -1.7% 3.97 MiB 3.98 MiB +0.2% 26.3 ms 22.3 ms -15.4% (1.18× faster) 🟢 210.23B 203.74B -3.1% 🟢
Char.ofOrdinal_le_of_le 5.599 s 5.014 s -10.5% (1.12× faster) 🟢 32.280 s 31.379 s -2.8% 85.590 88.050 +2.9% 99.81 GiB 101.09 GiB +1.3% 3.97 MiB 3.98 MiB +0.2% 27.6 ms 28.6 ms +3.6% ⚠️ 207.18B 208.08B +0.4%
Array.extract_append 5.315 s 4.858 s -8.6% (1.09× faster) 🟢 30.962 s 29.672 s -4.2% 🟢 51.870 54.120 +4.3% 🟢 95.00 GiB 95.36 GiB +0.4% 3.97 MiB 3.99 MiB +0.4% 26.0 ms 39.4 ms +51.3% (1.51× slower) ⚠️ 200.65B 200.40B -0.1%
Std.HashMap 5.445 s 4.864 s -10.7% (1.12× faster) 🟢 31.021 s 29.949 s -3.5% 🟢 65.830 68.180 +3.6% 🟢 94.50 GiB 95.90 GiB +1.5% 3.97 MiB 3.98 MiB +0.2% 25.4 ms 25.6 ms +0.8% 203.35B 204.11B +0.4%
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq 5.496 s 4.898 s -10.9% (1.12× faster) 🟢 32.335 s 29.501 s -8.8% (1.10× faster) 🟢 57.740 63.290 +9.6% (1.10× faster) 🟢 98.72 GiB 95.35 GiB -3.4% 🟢 3.97 MiB 3.98 MiB +0.3% 25.9 ms 31.9 ms +23.0% (1.23× slower) ⚠️ 205.59B 199.65B -2.9%
String.append 4.487 s 3.955 s -11.8% (1.13× faster) 🟢 28.710 s 27.141 s -5.5% (1.06× faster) 🟢 11.390 12.050 +5.8% (1.06× faster) 🟢 87.89 GiB 88.65 GiB +0.9% 3.97 MiB 3.97 MiB +0.1% 37.6 ms 27.4 ms -27.2% (1.37× faster) 🟢 168.67B 164.80B -2.3%
Nat.add_comm 3.619 s 3.077 s -15.0% (1.18× faster) 🟢 19.611 s 17.954 s -8.5% (1.09× faster) 🟢 2.350 2.560 +8.9% (1.09× faster) 🟢 58.66 GiB 58.03 GiB -1.1% 3.97 MiB 3.98 MiB +0.2% 27.6 ms 22.0 ms -20.4% (1.26× faster) 🟢 130.84B 124.20B -5.1% (1.05× fewer) 🟢
Pipeline total (7 constants)
constant total-time (main) total-time (PR) Δ% pipeline-throughput (const/s) (main) pipeline-throughput (const/s) (PR) Δ% pipeline-peak-ram (main) pipeline-peak-ram (PR) Δ%
ByteArray.utf8DecodeChar?_utf8EncodeChar_append 1m 4.4s 1m 1.0s -5.3% (1.06× faster) 🟢 43.120 45.520 +5.6% (1.06× faster) 🟢 101.44 GiB 99.74 GiB -1.7%
Char.ofOrdinal_le_of_le 59.164 s 57.172 s -3.4% 🟢 46.700 48.330 +3.5% 🟢 99.81 GiB 101.09 GiB +1.3%
Array.extract_append 54.887 s 52.851 s -3.7% 🟢 29.260 30.390 +3.9% 🟢 95.00 GiB 95.36 GiB +0.4%
Std.HashMap 47.243 s 45.577 s -3.5% 🟢 43.220 44.800 +3.7% 🟢 94.50 GiB 95.90 GiB +1.5%
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq 47.193 s 43.788 s -7.2% (1.08× faster) 🟢 39.560 42.640 +7.8% (1.08× faster) 🟢 98.72 GiB 95.35 GiB -3.4% 🟢
String.append 31.017 s 29.270 s -5.6% (1.06× faster) 🟢 10.540 11.170 +6.0% (1.06× faster) 🟢 87.89 GiB 88.65 GiB +0.9%
Nat.add_comm 20.680 s 18.939 s -8.4% (1.09× faster) 🟢 2.220 2.430 +9.5% (1.09× faster) 🟢 58.66 GiB 58.03 GiB -1.1%

Workflow logs

arthurpaulino pushed a commit that referenced this pull request Sep 2, 2026
The Warp x64 runner pool mixes Intel Granite Rapids and AMD Zen 5, and a
build job may land on one vendor while the job that runs its binaries
lands on the other. Neither vendor's feature set contains the other's, so
`-Ctarget-cpu=native` does not produce a portable binary: Zen 5 enables
SSE4A, and LLVM emits it. Disassembling the workspace built for znver5
finds 31 SSE4A instructions, all INSERTQ, in `ix-ffi` and in
`aiur_ixvm_witness::add_entries_parallel`. Granite Rapids has no SSE4A,
so the first one executed raises #UD, killing the process with SIGILL
during witness generation. That is what turned every row of #605's
benchmark into a crash.

Pin the measured intersection of the two CPUs instead. x86-64-v4 covers
every AVX-512 subset Plonky3 uses; +avx512vbmi2 preserves its VPSHRDQ
interleave and +gfni preserves LLVM's byte-shift lowering. A workspace
built with these flags contains no instruction absent from either vendor
and has an instruction vocabulary identical to a graniterapids build.
blake3 dispatches on CPUID at runtime and is unaffected either way.

`.cargo/config.toml` keeps `-Ctarget-cpu=native`: a developer builds and
runs on one machine, and x86-64-v4 would exclude every host without
AVX-512. Only CI has the split, so only CI pins the ISA. The new guard
fails the job when a runner lacks a required feature, so the assumption
is enforced rather than assumed, and the shared `warp-x64` cargo cache
key becomes sound now that codegen no longer varies by host. RUSTFLAGS
is hashed into that key, so the flag change rotates it on its own.

Pinning also removes a benchmarking hazard that never crashed: LLVM sets
prefer-256-bit for Granite Rapids but not for Zen 5, so the same source
vectorized 3.2x more widely depending on the build host, and main-vs-PR
timings were not comparable across a vendor split.
@arthurpaulino
arthurpaulino force-pushed the ap/bump-p3 branch 3 times, most recently from d4140ee to b3b7919 Compare September 2, 2026 18:20
@arthurpaulino
arthurpaulino marked this pull request as ready for review September 2, 2026 18:24
@arthurpaulino

Copy link
Copy Markdown
Member Author

!benchmark aiur-sharded-env

@arthurpaulino

Copy link
Copy Markdown
Member Author

!benchmark fresh

@argument-ci-bot

argument-ci-bot Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

!benchmark — main vs b3b7919

backends: aiur=prove · envs: InitStd · baseline: fresh (benchmark products rebuilt, base-SHA run, bencher bypassed)

aiur · InitStd · prove — main from: base run @ b6195f0 (fresh — bencher bypassed)

7 constants · 2 with regressions · 7 with improvements (|Δ| > 3.0% on any metric).

IxVM on FRI (7 constants)
constant execute-time (main) execute-time (PR) Δ% prove-time (main) prove-time (PR) Δ% throughput (const/s) (main) throughput (const/s) (PR) Δ% peak-ram (main) peak-ram (PR) Δ% proof-size (main) proof-size (PR) Δ% verify-time (main) verify-time (PR) Δ% fft-cost (main) fft-cost (PR) Δ%
ByteArray.utf8DecodeChar?_utf8EncodeChar_append 9.280 s 9.093 s -2.0% 32.071 s 30.300 s -5.5% (1.06× faster) 🟢 86.530 91.590 +5.8% (1.06× faster) 🟢 71.30 GiB 72.84 GiB +2.2% 11.37 MiB 11.11 MiB -2.3% 70.4 ms 80.0 ms +13.6% (1.14× slower) ⚠️ 136.01B 136.01B +0.0%
Char.ofOrdinal_le_of_le 7.063 s 7.001 s -0.9% 27.989 s 25.880 s -7.5% (1.08× faster) 🟢 98.720 106.760 +8.1% (1.08× faster) 🟢 64.35 GiB 65.88 GiB +2.4% 11.37 MiB 11.11 MiB -2.3% 69.4 ms 63.3 ms -8.9% (1.10× faster) 🟢 104.21B 104.21B +0.0%
Array.extract_append 6.700 s 6.581 s -1.8% 24.287 s 22.985 s -5.4% (1.06× faster) 🟢 66.120 69.870 +5.7% (1.06× faster) 🟢 52.27 GiB 53.00 GiB +1.4% 11.28 MiB 11.02 MiB -2.3% 78.1 ms 55.8 ms -28.5% (1.40× faster) 🟢 98.00B 98.00B +0.0%
Std.HashMap 4.070 s 4.097 s +0.7% 16.581 s 15.573 s -6.1% (1.06× faster) 🟢 123.150 131.130 +6.5% (1.06× faster) 🟢 36.58 GiB 37.31 GiB +2.0% 11.30 MiB 11.06 MiB -2.1% 68.9 ms 64.4 ms -6.4% (1.07× faster) 🟢 62.93B 62.93B +0.0%
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq 3.826 s 3.666 s -4.2% 🟢 15.454 s 14.407 s -6.8% (1.07× faster) 🟢 120.810 129.590 +7.3% (1.07× faster) 🟢 34.23 GiB 35.05 GiB +2.4% 11.30 MiB 11.05 MiB -2.2% 70.1 ms 59.2 ms -15.5% (1.18× faster) 🟢 56.49B 56.49B +0.0%
String.append 439.6 ms 437.9 ms -0.4% 2.360 s 2.220 s -5.9% (1.06× faster) 🟢 138.570 147.270 +6.3% (1.06× faster) 🟢 5.85 GiB 6.08 GiB +4.0% ⚠️ 9.98 MiB 9.78 MiB -2.0% 62.0 ms 51.9 ms -16.4% (1.20× faster) 🟢 3.45B 3.45B +0.0%
Nat.add_comm 265.2 ms 265.3 ms +0.0% 1.082 s 1.043 s -3.6% 🟢 42.510 44.120 +3.8% 🟢 4.85 GiB 4.12 GiB -15.0% (1.18× smaller) 🟢 9.13 MiB 8.95 MiB -2.0% 54.9 ms 43.9 ms -20.1% (1.25× faster) 🟢 314.33M 314.33M +0.0%
FRI verifier on FRI (7 constants)
constant execute-time (main) execute-time (PR) Δ% prove-time (main) prove-time (PR) Δ% throughput (const/s) (main) throughput (const/s) (PR) Δ% peak-ram (main) peak-ram (PR) Δ% proof-size (main) proof-size (PR) Δ% verify-time (main) verify-time (PR) Δ% fft-cost (main) fft-cost (PR) Δ%
ByteArray.utf8DecodeChar?_utf8EncodeChar_append 5.779 s 5.102 s -11.7% (1.13× faster) 🟢 34.102 s 31.249 s -8.4% (1.09× faster) 🟢 81.370 88.800 +9.1% (1.09× faster) 🟢 101.30 GiB 101.68 GiB +0.4% 3.97 MiB 4.00 MiB +0.8% 27.8 ms 36.2 ms +30.1% (1.30× slower) ⚠️ 212.83B 209.69B -1.5%
Char.ofOrdinal_le_of_le 5.639 s 4.995 s -11.4% (1.13× faster) 🟢 33.381 s 31.204 s -6.5% (1.07× faster) 🟢 82.770 88.540 +7.0% (1.07× faster) 🟢 100.60 GiB 101.71 GiB +1.1% 3.97 MiB 4.01 MiB +1.1% 36.3 ms 26.9 ms -25.8% (1.35× faster) 🟢 209.51B 208.66B -0.4%
Array.extract_append 5.437 s 4.858 s -10.6% (1.12× faster) 🟢 30.504 s 28.614 s -6.2% (1.07× faster) 🟢 52.650 56.130 +6.6% (1.07× faster) 🟢 90.34 GiB 91.82 GiB +1.6% 3.97 MiB 4.01 MiB +1.0% 25.2 ms 23.8 ms -5.8% (1.06× faster) 🟢 198.99B 198.51B -0.2%
Std.HashMap 5.457 s 5.039 s -7.7% (1.08× faster) 🟢 31.970 s 30.516 s -4.5% 🟢 63.870 66.920 +4.8% 🟢 95.43 GiB 97.66 GiB +2.3% 3.97 MiB 4.00 MiB +0.8% 26.0 ms 22.7 ms -12.6% (1.14× faster) 🟢 205.89B 208.71B +1.4%
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq 5.502 s 4.916 s -10.6% (1.12× faster) 🟢 33.206 s 30.883 s -7.0% (1.08× faster) 🟢 56.230 60.450 +7.5% (1.08× faster) 🟢 98.13 GiB 99.53 GiB +1.4% 3.97 MiB 4.00 MiB +0.7% 39.2 ms 30.4 ms -22.4% (1.29× faster) 🟢 204.62B 203.56B -0.5%
String.append 4.594 s 4.080 s -11.2% (1.13× faster) 🟢 28.906 s 27.602 s -4.5% 🟢 11.310 11.850 +4.8% 🟢 87.84 GiB 89.23 GiB +1.6% 3.97 MiB 4.00 MiB +0.8% 25.9 ms 22.2 ms -14.2% (1.16× faster) 🟢 171.11B 169.61B -0.9%
Nat.add_comm 3.584 s 3.217 s -10.2% (1.11× faster) 🟢 19.640 s 18.309 s -6.8% (1.07× faster) 🟢 2.340 2.510 +7.3% (1.07× faster) 🟢 58.68 GiB 58.62 GiB -0.1% 3.97 MiB 4.01 MiB +1.0% 28.8 ms 22.3 ms -22.5% (1.29× faster) 🟢 127.54B 129.00B +1.1%
Pipeline total (7 constants)
constant total-time (main) total-time (PR) Δ% pipeline-throughput (const/s) (main) pipeline-throughput (const/s) (PR) Δ% pipeline-peak-ram (main) pipeline-peak-ram (PR) Δ%
ByteArray.utf8DecodeChar?_utf8EncodeChar_append 1m 6.2s 1m 1.5s -7.0% (1.08× faster) 🟢 41.940 45.090 +7.5% (1.08× faster) 🟢 101.30 GiB 101.68 GiB +0.4%
Char.ofOrdinal_le_of_le 1m 1.4s 57.084 s -7.0% (1.08× faster) 🟢 45.020 48.400 +7.5% (1.08× faster) 🟢 100.60 GiB 101.71 GiB +1.1%
Array.extract_append 54.791 s 51.600 s -5.8% (1.06× faster) 🟢 29.310 31.120 +6.2% (1.06× faster) 🟢 90.34 GiB 91.82 GiB +1.6%
Std.HashMap 48.551 s 46.088 s -5.1% (1.05× faster) 🟢 42.060 44.310 +5.3% (1.05× faster) 🟢 95.43 GiB 97.66 GiB +2.3%
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq 48.660 s 45.290 s -6.9% (1.07× faster) 🟢 38.370 41.220 +7.4% (1.07× faster) 🟢 98.13 GiB 99.53 GiB +1.4%
String.append 31.266 s 29.822 s -4.6% 🟢 10.460 10.960 +4.8% 🟢 87.84 GiB 89.23 GiB +1.6%
Nat.add_comm 20.722 s 19.352 s -6.6% (1.07× faster) 🟢 2.220 2.380 +7.2% (1.07× faster) 🟢 58.68 GiB 58.62 GiB -0.1%

Workflow logs

@argument-ci-bot

argument-ci-bot Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

!benchmark — main vs b3b7919

backends: aiur-sharded-env · envs: ISLB

aiur-sharded-env · ISLB — main from: bencher @ b6195f0

1 constant · 1 with regressions · 1 with improvements (|Δ| > 3.0% on any metric).

constant check-time (main) check-time (PR) Δ% throughput (const/s) (main) throughput (const/s) (PR) Δ% peak-ram (main) peak-ram (PR) Δ% constants (main) constants (PR) Δ% shards (main) shards (PR) Δ%
ISLB 1m 37.9s 1m 24.6s -13.6% (1.16× faster) 🟢 1.87K 2.16K +15.7% (1.16× faster) 🟢 91.43 GiB 95.22 GiB +4.1% ⚠️ 183,062 183,062 +0.0% 152 152 +0.0%

Workflow logs

arthurpaulino and others added 6 commits September 2, 2026 20:51
Update the multi-stark dependency and Rust toolchain for Plonky3 0.6, along with the Rust 1.98 lint migrations required to keep the workspace warning-free. Refresh the Rust-compatible Blake3.lean pin in both root and compile-package manifests.

Adapt recursive Aiur verification to Plonky3's pruned FRI multiproofs. Native proofs retain their compact serialized representation and native verification path; the FFI expands authenticated Merkle frontiers into per-query advice only when entering the existing recursive verifier circuit.

Preserve the packed claim-digest convention in the recursion diagnostic and exercise the advice boundary in the end-to-end test and benchmark paths. CPU and CUDA recursive q1 runs produce identical 823,485-byte inner proofs and 331,273-byte outer proofs.

The q50 Vector.extract_append workload retains identical CPU/CUDA proof sizes. Inner plus outer STARK proving measures 65.87s on CPU and 8.81s with CUDA on the RTX PRO 6000, a 7.48x speedup.
PR benchmark runs execute trusted workflow YAML from the default branch while loading composite actions from the PR checkout. When Bencher data and binary caches are unavailable, the workflow checks out main under base/ and asks Lake to rebuild it without first installing the Rust channel pinned by that checkout.

Teach the existing CPU provenance action to install the base checkout's validated Rust channel and profile immediately before an uncached base build. The step is a no-op when the toolchain is already available and leaves cached benchmark comparisons unchanged.
Consume the Plonky3 0.6 batch-opening layout directly in Aiur instead of expanding every pruned Merkle frontier into one authentication path per FRI query. Sample all query indices from the unchanged transcript, sort and deduplicate them with an O(q log q) merge sort, authenticate each input and commit-phase commitment once, then retain the existing per-query reduced-opening and FRI arithmetic.

Bind every frontier to transcript-derived indices, consume boundary digests in Plonky3's level/parent/child order, reject trailing frontier elements and inconsistent duplicate leaves, and assert all native opening dimensions and sibling counts. Explicitly constrain the digest-bound protocol specialization to cap height 0, binary FRI, and a constant final polynomial. Move memo_u32_less_than into IxVM Core so both substitution and multiproof sorting share its constrained rows.

Strengthen the recursive negative test to mutate a structurally valid stage-1 commitment. Regenerate both checked-in Aiur Rust executors and retain interpreter/codegen query-count parity.

On Vector.extract_append q50, recursive-verifier FFT cost falls from 204.073B to 201.166B. CPU outer proving improves from 50.09s to 45.03s and the full CPU pipeline from 90.64s to 82.90s. GPU outer proving improves from 15.85s to 13.72s and the full GPU pipeline from 28.86s to 26.69s. The outer proof grows from 3.92 MB to 4.17 MB.

Validated with the MultiStark primitive suite, recursive honest/tamper/parity tests, codegen --check, release workspace clippy, release CUDA clippy, rustfmt, and diff checks.
The Warp x64 runner pool mixes Intel Granite Rapids and AMD Zen 5, and a
build job may land on one vendor while the job that runs its binaries
lands on the other. Neither vendor's feature set contains the other's, so
`-Ctarget-cpu=native` does not produce a portable binary: Zen 5 enables
SSE4A, and LLVM emits it. Disassembling the workspace built for znver5
finds 31 SSE4A instructions, all INSERTQ, in `ix-ffi` and in
`aiur_ixvm_witness::add_entries_parallel`. Granite Rapids has no SSE4A,
so the first one executed raises #UD, killing the process with SIGILL
during witness generation. That is what turned every row of #605's
benchmark into a crash.

Pin the measured intersection of the two CPUs instead. x86-64-v4 covers
every AVX-512 subset Plonky3 uses; +avx512vbmi2 preserves its VPSHRDQ
interleave and +gfni preserves LLVM's byte-shift lowering. A workspace
built with these flags contains no instruction absent from either vendor
and has an instruction vocabulary identical to a graniterapids build.
blake3 dispatches on CPUID at runtime and is unaffected either way.

`.cargo/config.toml` keeps `-Ctarget-cpu=native`: a developer builds and
runs on one machine, and x86-64-v4 would exclude every host without
AVX-512. Only CI has the split, so only CI pins the ISA. The new guard
fails the job when a runner lacks a required feature, so the assumption
is enforced rather than assumed, and the shared `warp-x64` cargo cache
key becomes sound now that codegen no longer varies by host. RUSTFLAGS
is hashed into that key, so the flag change rotates it on its own.

Pinning also removes a benchmarking hazard that never crashed: LLVM sets
prefer-256-bit for Granite Rapids but not for Zen 5, so the same source
vectorized 3.2x more widely depending on the build host, and main-vs-PR
timings were not comparable across a vendor split.
#606)

* Authenticate all frontier group members in the recursive verifier

The in-circuit pruned-multiproof walk (mmcs_verify_multi / frontier_level)
collapses queries that share a parent to a single lead node and hashes
only the lead's rows via inject_maybe(ar, ...). Non-lead members' opened
rows for the shorter (injected) matrices were still consumed in their own
per-query FRI arithmetic (batch_views_at) but never authenticated against
any commitment — the leaf hash covers only the tallest matrices, and
shorter ones are bound solely through injection. A prover could therefore
forge a non-lead member's shorter-matrix opening. Plonky3's reference
verify_batch_pruned guards exactly this with InconsistentGroupOpening
(and InconsistentDuplicateOpenings for equal-index queries); the port had
neither. The prior per-query walk did not have the gap, so it was
introduced with the direct multiproof consumption.

- frontier_level: on a group merge, assert the lead and member agree on
  every not-yet-injected matrix (height <= next_lh) via select_rows_le +
  pointer equality. Transitive across pairwise merges, so the whole group
  is pinned; matches InconsistentGroupOpening.
- frontier_merge: duplicate transcript indices must open the SAME full
  rows, not merely the same tallest-matrix leaf digest; matches
  InconsistentDuplicateOpenings.

Pointer equality is admissible inside assert_eq! (equal pointers imply
equal content; a spurious mismatch costs only completeness — see
IxVM.Core). select_rows_le selects rows of matrices at height <= target,
mirroring select_rows.

Validated: the group-merge branch is genuinely reached by the factorial
recursion proof (an always-false variant of the new assert fails the
honest test), the honest proof still verifies with the real assert
(completeness preserved), the existing tamper tests still reject, and
the full lake test suite is green (2717 checks). aiur_multi_stark.rs
regenerated; kernel executor unchanged.

* Drop the multi_stark::advice dependency

Companion to multi-stark removing its unused per-query advice module.
ix consumed native pruned multiproofs directly and referenced only
advice::AdviceError, whose two arms (verification failed, serialization
failed) were immediately string-formatted by the FFI. Replace it with a
plain Result<Vec<u8>, String>: AiurSystem::proof_to_advice_bytes maps
both failures to a message, and the FFI passes the string straight to
LeanExcept::error_string. No behavior change; the Lean binding
(Except String ByteArray) is unaffected.

Bump the multi-stark pin to the advice-removed revision. Requires that
multi-stark's ap/bump-p3-drop-advice be pushed first, exactly as with
every other pin in this series.

* Bump multi-stark audit revision

---------

Co-authored-by: Arthur Paulino <arthurleonardo.ap@gmail.com>
@arthurpaulino
arthurpaulino added this pull request to the merge queue Sep 2, 2026
Merged via the queue into main with commit 7bc69a3 Sep 2, 2026
14 checks passed
@arthurpaulino
arthurpaulino deleted the ap/bump-p3 branch September 2, 2026 21:31
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.

2 participants