Visitar URL original
perf(akita): keep auxiliary commitment buffers compact and reuse their owner by GUJustin · Pull Request #2185 · a16z/jolt · GitHub
Skip to content

perf(akita): keep auxiliary commitment buffers compact and reuse their owner - #2185

Merged
quangvdao merged 6 commits into
mainfrom
astra/compact-pcs-objects
Nov 6, 2026
Merged

quangvdao merged 6 commits into
mainfrom
astra/compact-pcs-objects

Conversation

@GUJustin

@GUJustin GUJustin commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Stage 0 currently copies the fused increment vector into a dense buffer and commits it on a separate backend. Stage 8 then imports and recommits that object on the trace backend. This change consumes the owned increment buffer, keeps its zero suffix implicit, and commits it on the backend that will open it. Same-owner import can then reuse the handle.

Field-inline full-width objects also expose their stored evaluation prefix and reuse the trace backend when available. Their full-width catalog stays separate from the bounded increment catalog; sharing a backend does not widen the admitted values. Foreign-owner handles still go through Akita's checked import path.

Polynomial arities, commitment geometry, proof format, and verifier algorithms are unchanged. The generic PCS fallback materializes the zero suffix. This change adds no exact-trace-length preprocessing requirement.

Akita #292 has merged. All twelve Akita dependencies now point to the landed main revision 28602b086d65f12fa5b1b2784d7dbbe560e9a642. The branch merges Jolt main efe11cc while preserving the existing review history and Quang's changes.

Validation at 1b2c250: 72 Akita library tests, 33 selected polynomial/opening tests, two affected field-inline kernel tests, ten ordinary Akita guest proofs, three field-inline fixtures each in clear/Akita/ZK modes, the standard_muldiv verifier fixture, and the advice-larger-than-trace grouped-opening integration test pass. Strict workspace Clippy in host and host+zk modes, affected Akita Clippy, formatting, field identity, and style checks pass. The bounded-source test rejects oversized values and checks that compact prefixes commit to their zero extension.

A fresh matched comparison near 2^20 cycles on the M5 Max reduces proving time by 3.26% for Fib, 2.91% for SHA-2, and 3.48% for B-tree. Six, six, and eight paired blocks survive the predeclared health exclusions; each paired 95% interval excludes no change. All 54 proofs verify and match the existing canonical bytes. Both arms use main 413607f plus #2306, the same landed Akita revision, and the same private Rayon waiting policy (16 workers, 64 microseconds). These are isolated PR effects on that stack, not released-main throughput.

Mean paired peak-RSS changes are -22.7 MiB for Fib, -14.8 MiB for SHA-2, and +20.6 MiB for B-tree. The B-tree increase is unresolved. Targeted traced runs confirm the mechanism: auxiliary import falls from 13–15 ms to about 2 microseconds, and fused increment commitment saves 7–9 ms. These timings explain the clean-run gain; they are not an additional gain. Twenty proofs near 2^27 cycles also verify and match canonical bytes. One Fib pair and one B-tree pair passed the background-CPU filter (3.18% and 1.82% less proving time, respectively). The B-tree pair used about 1.0 GiB less peak RSS. These are coarse regression checks, not precise estimates of large-trace gains. No SHA-2 pair passed, so its large-trace performance remains unresolved. The small B-tree RSS increase reproduces in the traced runs; its cause is still under investigation.

@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

📏 PR diff

Note

Actual code changed: 215 lines

🟢 +145 added    🔴 −70 removed

Tests, docs, fixtures, and helper scripts excluded.

Category 🟢 Added 🔴 Removed
⌨️ Actual code +145 −70
🧪 Tests +18 −1
📚 Docs +8 0
📦 Fixtures +16 −16
🔧 Helper scripts 0 0
Total diff +187 −87

Every changed line is classified once.

@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Benchmark comparison (crates)

Same-runner A/B: base_run = 894ed05 (merge target) vs pr_run = 1b2c250 (PR head merged onto it). Bold = faster run; Δ colored when the difference exceeds the ±10% noise threshold.

2 of 92 benchmarks differ by more than ±10%:

Benchmark base_run (merge target) pr_run (this PR) Δ
Polynomial::bind/14 136.6±17.90µs 154.8±40.99µs ${\color{red}\mathbf{+13.3\%}}$
append_bytes/Blake2b/32B 78.0±21.58ns 69.2±4.04ns ${\color{green}\mathbf{-11.3\%}}$
All 92 benchmarks
Benchmark base_run (merge target) pr_run (this PR) Δ
EqPolynomial::evals/17 1.9±0.02ms 1.9±0.19ms +4.2%
EqPolynomial::evals/19 7.1±0.10ms 7.0±0.09ms -0.6%
EqPolynomial::evals/20 19.2±0.36ms 19.2±0.35ms -0.2%
EqPolynomial::evals/22 79.9±5.90ms 77.1±1.58ms -3.5%
EqPolynomial::evaluations/14 502.1±10.41µs 503.3±14.65µs +0.2%
EqPolynomial::evaluations/18 6.4±0.06ms 6.4±0.05ms -0.1%
EqPolynomial::evaluations/20 41.6±2.25ms 40.2±0.25ms -3.2%
F128/accumulator/deferred 2.6±0.07µs 2.6±0.07µs +0.1%
F128/accumulator/naive 4.5±0.04µs 4.5±0.03µs +0.2%
F128/mul 3.8±0.02ns 3.7±0.02ns -0.1%
F128/mul_slice 3.5±0.04µs 3.5±0.03µs -0.1%
F128/square 3.4±0.02ns 3.4±0.01ns -0.1%
F192/accumulator/deferred 5.4±0.03µs 5.5±0.06µs +0.9%
F192/accumulator/naive 8.6±0.09µs 8.7±0.06µs +0.3%
F192/mul 8.4±0.07ns 8.4±0.07ns +0.1%
F192/mul_slice 7.7±0.16µs 7.7±0.04µs -0.2%
F192/square 5.6±0.04ns 5.6±0.07ns +0.1%
F64/accumulator/deferred 986.7±28.86ns 969.5±15.15ns -1.7%
F64/accumulator/naive 1.9±0.02µs 1.9±0.02µs -0.3%
F64/mul 1.9±0.02ns 1.9±0.01ns -0.2%
F64/mul_slice 1.9±0.01µs 1.9±0.01µs +0.8%
F64/square 1.9±0.06ns 1.9±0.01ns -1.0%
Polynomial::bind/14 136.6±17.90µs 154.8±40.99µs ${\color{red}\mathbf{+13.3\%}}$
Polynomial::bind/18 2.0±0.02ms 2.0±0.02ms +0.3%
Polynomial::bind/20 7.8±0.05ms 7.8±0.07ms -0.1%
Polynomial::bind_low_to_high_in_place/Fr/14 213.0±4.43µs 216.5±5.31µs +1.6%
Polynomial::bind_low_to_high_in_place/Fr/20 8.1±0.36ms 8.0±0.12ms -0.9%
Polynomial::bind_low_to_high_in_place/Fr/24 123.3±0.63ms 124.1±4.87ms +0.7%
Polynomial::bind_low_to_high_in_place/Prime128OffsetA7F7/14 56.4±0.53µs 56.6±0.53µs +0.3%
Polynomial::bind_low_to_high_in_place/Prime128OffsetA7F7/20 1.9±0.03ms 1.9±0.03ms -0.3%
Polynomial::bind_low_to_high_in_place/Prime128OffsetA7F7/24 27.4±0.15ms 27.7±1.16ms +1.0%
Polynomial::evaluate/20 53.7±0.30ms 53.3±0.31ms -0.8%
UnivariatePoly::from_evals/16 52.0±0.83µs 52.1±1.03µs +0.0%
UnivariatePoly::from_evals/3 6.4±0.12µs 6.3±0.12µs -0.1%
UnivariatePoly::from_evals/4 9.5±0.16µs 9.5±0.16µs +0.1%
UnivariatePoly::from_evals/8 23.3±0.48µs 23.3±0.39µs +0.0%
append_bytes/Blake2b/256B 360.9±15.09ns 353.3±6.12ns -2.1%
append_bytes/Blake2b/32B 78.0±21.58ns 69.2±4.04ns ${\color{green}\mathbf{-11.3\%}}$
append_bytes/Keccak/256B 798.6±31.35ns 809.0±20.13ns +1.3%
append_bytes/Keccak/32B 52.7±4.19ns 55.9±7.51ns +6.2%
append_bytes/Poseidon/256B 222.4±1.53µs 221.8±1.75µs -0.3%
append_bytes/Poseidon/32B 69.9±1.14µs 70.2±1.51µs +0.4%
challenge/Blake2b 849.4±24.28ns 829.3±11.94ns -2.4%
challenge/Keccak 566.3±6.24ns 564.9±4.14ns -0.3%
field arithmetic/add/fp128_a7f7 4.1±0.09µs 4.1±0.02µs -0.4%
field arithmetic/add/fp32_c99 3.1±0.05µs 3.1±0.01µs -0.2%
field arithmetic/add/fp64_c59 3.1±0.04µs 3.1±0.02µs -0.4%
field arithmetic/mul/fp128_a7f7 15.3±0.20µs 15.3±0.09µs -0.2%
field arithmetic/mul/fp32_c99 5.6±0.09µs 5.6±0.12µs -0.4%
field arithmetic/mul/fp64_c59 8.1±0.06µs 8.1±0.04µs -0.2%
field arithmetic/square/fp128_a7f7 18.0±0.27µs 18.0±0.19µs -0.1%
field arithmetic/square/fp32_c99 6.2±0.07µs 6.2±0.08µs -0.1%
field arithmetic/square/fp64_c59 6.7±0.03µs 6.7±0.04µs -0.2%
field arithmetic/sub/fp128_a7f7 3.9±0.02µs 3.9±0.02µs +0.0%
field arithmetic/sub/fp32_c99 2.3±0.01µs 2.3±0.02µs +0.4%
field arithmetic/sub/fp64_c59 2.3±0.07µs 2.3±0.01µs -1.1%
field reduction/reduce_product/fp128_a7f7 25.4±1.82µs 25.7±1.97µs +1.4%
fp64_prime63_offset259/ext2_packed_mul 15.6±0.10ns 15.6±0.10ns -0.1%
fp64_prime63_offset259/ext2_scalar_mul 7.8±0.04ns 7.8±0.12ns +0.1%
fp64_prime63_offset259/packed_mul 7.0±0.12ns 6.8±0.16ns -2.5%
fp64_prime63_offset259/scalar_mul 2.6±0.03ns 2.6±0.10ns +0.2%
fp64_prime64_offset59/ext2_dependent_mul_1024 8.8±0.06µs 8.8±0.01µs -0.1%
fp64_prime64_offset59/ext2_neg_one_scalar_mul 7.0±0.06ns 6.9±0.06ns -0.5%
fp64_prime64_offset59/ext2_packed_mul 18.8±0.06ns 18.8±0.09ns +0.0%
fp64_prime64_offset59/ext2_scalar_mul 7.8±0.26ns 7.8±0.13ns +0.0%
fp64_prime64_offset59/ext2_scalar_square 6.4±0.05ns 6.4±0.06ns +0.0%
g1_add 412.3±3.51ns 410.2±4.65ns -0.5%
g1_deserialize_bincode 8.7±0.08µs 8.7±0.10µs +0.1%
g1_double 205.1±1.94ns 205.5±1.55ns +0.2%
g1_msm/1024 12.7±0.30ms 12.7±0.04ms -0.1%
g1_msm/16 536.6±5.06µs 538.1±5.21µs +0.3%
g1_msm/256 4.3±0.03ms 4.2±0.01ms -0.3%
g1_msm/4 254.5±10.55µs 252.6±2.42µs -0.8%
g1_msm/64 1.6±0.01ms 1.6±0.02ms -0.7%
g1_scalar_mul 63.6±0.65µs 64.3±0.96µs +1.2%
g1_serialize_bincode 131.3±2.59ns 125.9±1.18ns -4.1%
g2_msm/16 1.9±0.02ms 1.9±0.01ms -0.5%
g2_msm/256 15.4±0.13ms 15.3±0.04ms -0.7%
g2_msm/4 770.1±7.99µs 765.1±6.71µs -0.7%
g2_msm/64 5.6±0.07ms 5.5±0.01ms -0.7%
g2_scalar_mul 319.3±1.83µs 321.7±5.30µs +0.7%
gt_scalar_mul 513.5±8.20µs 513.3±7.76µs +0.0%
multi_pairing/16 5.7±0.01ms 5.7±0.02ms +0.1%
multi_pairing/2 1.2±0.01ms 1.2±0.02ms +0.4%
multi_pairing/4 1.8±0.01ms 1.8±0.07ms +1.7%
multi_pairing/8 3.1±0.01ms 3.1±0.01ms +0.1%
pairing 901.4±7.27µs 910.9±14.55µs +1.1%
pedersen_commit/1024 12.8±0.09ms 12.7±0.03ms -0.4%
pedersen_commit/16 605.1±7.92µs 607.1±5.28µs +0.3%
pedersen_commit/256 4.3±0.02ms 4.3±0.02ms +0.0%
pedersen_commit/4 315.5±1.95µs 316.3±1.68µs +0.3%
pedersen_commit/64 1.7±0.02ms 1.7±0.01ms +0.1%

@quangvdao

Copy link
Copy Markdown
Collaborator

Review: changes requested (merge blocked on the Akita fork pin)

Reviewed head 90bdaf0ccc656487861083dca510306294615278 (draft).

The compact-prefix path is correct. It gives byte-identical proofs to main for the inputs tested. It cannot merge yet because it pins a personal Akita fork and needs a fork-only API. Both independent reviews request changes for that reason: Claude Opus and GPT-6 Astra (high).

Blocker: the Akita fork pin

Cargo.toml:306-314 points all nine Akita crates at GUJustin/akita-layerzero@ec0efc73. The Jolt code calls DensePoly::from_field_prefix (scheme.rs:721, 735), which exists only on that fork. So repinning to upstream main (038db2d1) does not compile.

Path to merge:

  1. Land 1a86a8cc and ec0efc73 in LayerZero-Labs/akita. They apply cleanly on upstream main 038db2d1.
  2. Repin all nine crates to the landed upstream revision.
  3. Re-run the compact/fallback, Akita, field-inline and verifier-fixture checks.

ec0efc73 is needed to compile. 1a86a8cc is not needed for correctness, but without it there is no "reuse their owner" saving: a same-owner import would get a fresh id and recompute.

What this PR changes in Akita (f594bfc to ec0efc73)

Commit Where Change API Protocol
94d8833e upstream Book, docs and security-posture text; comments only in code none none
ed90d495 upstream validate_setup_prefix_geometry now requires inner num_digits == compute_num_digits_field_width(...) Signature unchanged Stricter setup admission (see below)
038db2d1 upstream VerifierChannel::receive_bytes rejects len > proof_len before try_reserve Internal only (pub(super)) None. This is DoS hardening: such proofs were already rejected later.
1a86a8cc fork Same-owner import_commitment returns an Arc clone with the same commitment id Signature unchanged None (prover side only)
ec0efc73 fork Compact dense sources: DensePoly::from_field_prefix, nonzero_ring_coeffs, and consumers clipped to the non-zero rings while logical block geometry is kept Additive None (same committed polynomial)

Is it protocol-breaking?

  • For Jolt, no. Jolt's shipped schedules are full width, so ed90d495 accepts them unchanged. The Opus review compared main (akita f594bfc) against this head on three programs:

    • field_ops, field_ops with 8 words of untrusted advice, and muldiv;
    • optimized backend, Akita, field-inline.

    It serialized the proof, the verifier preprocessing and public_io for each: 9 of 9 files are byte-identical. Separately, the Astra review found that compact and full inputs give identical commitments across 9 prefix lengths, and identical proof bytes for a fixed input at this head.

  • For Akita on its own, ed90d495 strictly shrinks the set of setups the verifier accepts. It now rejects shallow setup-prefix digit layouts (for example q128 with log_basis=1, num_digits=1) that were accepted before. It is a soundness fix: it closes a truncated-setup-commitment hole, and no shipped artifact changes. It is worth calling out explicitly when repinning rather than describing the bump as "protocol unchanged".

  • API: additive only. The new trait methods TransparentObjectSetup::commit_bounded_object and MultilinearPoly::dense_evaluation_prefix both have defaults, so no downstream implementor breaks.

What was checked and holds

  • Zero suffix. The implicit zero suffix is equivalent to materialized zeros. Every fork consumer clips to the non-zero rings but keeps the logical block count and matrix row width. dense_evaluation_prefix is Some only when t_stride == 1, which is exactly the contiguous prefix.
  • Generic PCS fallback. commit_bounded_object's default zero-extends and calls commit, which is the old FusedInc body. It now gives an explicit error where resize used to silently truncate.
  • Bounds stay separate. The bounded and full-width catalogs are still distinct even when they share a backend, and a compact 2^80 coefficient is still rejected on the bounded path.
  • Same-owner import. It clones an immutable Arc, so there is no shared-mutation hazard. release_post_commit_ntt_residency skips backends that are Arc::ptr_eq to the one-hot owner. Foreign handles are still recomputed.
  • Verifier. None of the changed Jolt paths is reachable from the verifier.

Lower-priority notes

  1. Stale comment. native_batching.rs:307-312 still says auxiliary objects are committed on their own dense backends and that every import re-derives the commitment. After this PR, FusedInc and full-width objects are committed on the one-hot owner, and the import is an Arc clone.
  2. Repeated decoding. commit_bounded_object calls schedule_artifacts.bounded_dense_scheme() (scheme.rs:718), which re-decodes and audits the dense artifact on every call. setup.verifier.dense_scheme() already holds the decoded scheme. This is still cheaper than before, so it is not a regression.
  3. No shape check. commit_bounded_object skips validate_commit_shape. The backend still rejects bad arity, so this is about symmetry with commit, not correctness.
  4. Fork, prover side. ValidatedSparseChallenges::new now validates only the challenges for live rings. These are prover-derived, so there is no soundness impact.
  5. Conflict with perf(field-inline): retain only the increment prefix #2184. Both PRs add an accessor at the same spot in field_inline.rs. When resolving it, keep perf(field-inline): retain only the increment prefix #2184's storage bound.

Prepared with Claude Code (Opus 5.5), an independent Claude Opus review and an independent GPT-6 Astra (high) review; findings were reconciled.

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

Copy link
Copy Markdown
Collaborator

Pushed: Akita pin moved to LayerZero, merge with main, comment fix

With Justin's OK:

  • Upstream Akita PR. Opened LayerZero-Labs/akita#292 from the LayerZero-owned branch astra/compact-dense-prefix. It carries Justin's two commits unchanged: 1a86a8cc (same-owner import) and ec0efc73 (compact dense prefix).
  • Pushed to this branch (a fast-forward, with no force):
    1. Merge branch 'main'. The only conflict was perf(field-inline): retain only the increment prefix #2184's accessor in field_inline.rs. Both accessors are kept: prefix_len() is the convention across the kernels, and evaluation_prefix() is what dense_evaluation_prefix needs.
    2. chore(akita): pin the compact-source commits on LayerZero-Labs/akita.
      • All nine Akita crates (and the 16 lockfile entries) now point at https://github.com/LayerZero-Labs/akita.git with the same rev = ec0efc73, the head of akita#292. So this PR no longer depends on the personal fork, and the Akita source is byte-identical to what was reviewed.
      • The stale native_batching.rs comment is updated. FusedInc and full-width objects are committed on the trace backend, so only foreign handles are recomputed.

Still needed before merge: once akita#292 merges, repin from ec0efc73 to the resulting main commit, because a squash merge changes the SHA. After that the PR can leave draft.

Not changed here: the bounded_dense_scheme() re-decode, and the validate_commit_shape symmetry in commit_bounded_object. Both are Low and are not regressions.

Validation on the pushed head:

  • cargo metadata --locked resolves the new pin;
  • clippy -D warnings on jolt-akita, jolt-kernels and jolt-openings with --all-features: clean;
  • cargo nextest -p jolt-kernels -p jolt-akita -p jolt-openings --all-features: 319/319 passed, with one test skipped (the ~8-minute production-grid case);
  • CI is re-running on the new head.

Prepared with Claude Code (Opus 5.5).

@GUJustin
GUJustin marked this pull request as ready for review November 6, 2026 01:50
@github-actions

github-actions Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Verifier classifier: risk-4

Head 1b2c2509fd097d77a427e02f93f002646d438703

The Akita dependency upgrade reaches verifier, PCS, transcript, and serialization code, so acceptance changes cannot be ruled out. Catalog admission also feeds trusted verifier preprocessing. Other executable changes are confined to prover commitment generation and backend ownership; the native-batching change is comment-only.

Risk: risk-4

  • Cargo.lock: risk-4 — Updates resolved Akita verifier, PCS, transcript, and serialization dependencies used during verification.
  • Cargo.toml: risk-4 — Changes the pinned Akita revision, including verifier and protocol dependencies; acceptance equivalence cannot be established.
  • crates/jolt-akita/src/adapters.rs: risk-2 — Changes prover-only backend ownership and cache trimming, not verifier setup data or acceptance checks.
  • crates/jolt-akita/src/native_batching.rs: risk-1 — Only updates a comment explaining prover handle imports.
  • crates/jolt-akita/src/schedule_artifacts.rs: risk-4 — Changes the catalog-admission constructor feeding verifier_setup_from_params and trusted grouped schedules; equivalence of the upstream constructors cannot be established.
  • crates/jolt-akita/src/scheme.rs: risk-2 — Changes prover backend reuse and commitment-source construction. Verifier metadata construction, verification methods, and proof encoding remain unchanged locally.
  • crates/jolt-kernels/src/field_inline.rs: risk-2 — Adds a prefix accessor used only by the prover's compact commitment-source path.
  • crates/jolt-kernels/src/reference/akita/increments.rs: risk-2 — Routes witness commitment generation through the bounded-object helper; verifier claims and checks are unchanged.
  • crates/jolt-kernels/src/trace_column.rs: risk-2 — Exposes compact evaluations only to the prover's full-width commitment path; polynomial evaluation and verifier checks are unchanged.
  • crates/jolt-openings/src/schemes.rs: risk-2 — Adds a prover-only commitment helper whose default implementation zero-pads and invokes existing setup and commit methods.
  • crates/jolt-poly/src/multilinear.rs: risk-2 — Adds an optional prefix hook consumed only during prover commitment generation; existing evaluation behavior is unchanged.

gpt-6.1-sol, reasoning effort xhigh

@github-actions github-actions Bot added no-reviewer-assigned The policy waits for a person and no reviewer or assignee is set risk-4 Level-4 runtime, protocol, non-minimal shared-code or unclassified changes labels Nov 6, 2026

@quangvdao quangvdao left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review at 1b2c2509f: ready to merge

Last time this was blocked only by the Akita fork pin. That is resolved: all twelve Akita crates now pin LayerZero-Labs/akita main 28602b08, which is #292 as landed.

What changed since the last review (c0918c6b9)

  • Jolt code: unchanged. The diff against main under crates/ matches the reviewed head line for line. The only exception is one use merge in scheme.rs. Everything checked last time still holds: the implicit zero suffix, the generic fallback, the separate bounded and full-width catalogs, same-owner import, and verifier reachability.
  • Akita #292 as landed matches the reviewed fork commits. git diff 28602b086^ 28602b086 -- crates is the same patch as 038db2d1..ec0efc73 (1a86a8cc + ec0efc73).
  • The repin is a linear forward bump (8d5821f4 → 28602b08, five commits). The four other commits:
    • #307: CI only.
    • #314: test removals only.
    • #313: lifts the 2^26 decode cap only for borrow_trusted in-place views of caller-vouched bytes. Copying decoders of untrusted input keep the cap.
    • #277: reduces verifier work (grouped compression weights, batched setup rows, signed challenge sums). Its optional reductions are default-off features. It states that proof bytes are unchanged, and this PR's 54 canonical-byte matches agree. One wording point: the description says "verifier algorithms are unchanged". That is true of the Jolt code, but this bump does bring in a reimplementation of Akita's verifier computation. Worth one sentence, as with ed90d495 last time.
  • The schedule_artifacts.rs risk-4 flag is a false positive. AkitaCommitmentScheme::from_schedule_artifact is literally new(TrustedScheduleCatalog::from_artifact_bytes(bytes, chunking)?), so dense_catalog() decodes and validates exactly as before.
  • Merging with current main (b17bb7a82, three CI/bench commits) is clean, and cargo metadata --locked resolves. CI on this head: 74 pass, 5 skipped.

Notes (none blocking)

  1. New, Low. full_width entries now hold an Arc clone of the one-hot backend taken at preprocessing. AkitaProverSetup::with_setup_domain later replaces one_hot_cpu_backend with a larger one. After that:

    • full-width handles are foreign to the new owner, so the import falls back to the checked recompute;
    • the old backend stays alive through full_width, and the Arc::ptr_eq filter in release_post_commit_ntt_residency no longer dedupes it.

    This is correct, just a lost saving. Today only akita-recursion and tests call with_setup_domain, and they don't use field-inline full-width objects. If that combination becomes real, with_setup_domain could repoint the full_width entries that alias the old owner.

  2. Carried over, Low. commit_bounded_object still calls schedule_artifacts.bounded_dense_scheme(), which decodes and audits the dense artifact on each call, instead of reusing an already-decoded scheme.

  3. Carried over, Low. commit_bounded_object still skips the validate_commit_shape symmetry with commit. The backend rejects bad arity, so this is not a correctness issue.

  4. Open question. The +20.6 MiB peak RSS on B-tree is still unexplained. It is small next to the ~1 GiB saving at 2^27 and does not block, but it would be good to know whether it's FusedInc's compact source being retained on the trace owner from stage 0 to stage 8.

Prepared with Claude Code.

@github-actions github-actions Bot added merge-eligible AI merge gate review policy satisfied for the current head and removed no-reviewer-assigned The policy waits for a person and no reviewer or assignee is set risk-4 Level-4 runtime, protocol, non-minimal shared-code or unclassified changes labels Nov 6, 2026
@quangvdao
quangvdao merged commit cca857a into main Nov 6, 2026
89 checks passed
@github-actions github-actions Bot removed the merge-eligible AI merge gate review policy satisfied for the current head label Nov 6, 2026
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