fix(aiur): reject forged results and cyclic call traces - #631
Closed
johnchandlerburnham wants to merge 22 commits into
Closed
johnchandlerburnham wants to merge 22 commits into
johnchandlerburnham wants to merge 22 commits into
Conversation
Constrain inactive provider multiplicities, enforce range-checked call ranks, validate lookup message boundaries, and gate lookups in circuits whose control flow does not establish a unique writer. Check control counts, fixed-table shapes, and the global lookup budget. Align compiler layouts and witness generation with the rank constraints, retain supplied-witness regressions, and update the measured FFT baselines.
Inline all seven rounds and the digest fold into one acyclic row, preserving byte operations and validating the compiled component graph. Regenerate all executors and FFT pins, add independent word-reference and proof coverage, and document measured FFT, proving, memory and proof-size tradeoffs.
Halve comparison witness columns with the existing scalar range channel while preserving both u32 input bounds, boolean carries, strictness and advice promotion. Regenerate all executors and FFT pins, add supplied-trace and boundary regressions, and document FFT, proof-size and measured timing tradeoffs.
Move the three recursive calls for a Let into a ranked helper, preserving the lowering operations and body cutoff. Regenerate the executor and FFT pins, add whole-Let and nested-Let binding proofs, and document the measured FFT savings and timing/proof-size tradeoffs.
Member
|
!benchmark fresh |
Contributor
|
| 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.542 s | 9.720 s | +13.8% (1.14× slower) |
35.314 s | 40.541 s | +14.8% (1.15× slower) |
78.580 | 68.450 | -12.9% (1.15× slower) |
72.49 GiB | 78.57 GiB | +8.4% (1.08× larger) |
5.16 MiB | 7.01 MiB | +35.8% (1.36× larger) |
29.8 ms | 49.0 ms | +64.1% (1.64× slower) |
132.99B | 145.18B | +9.2% (1.09× more) |
Array.extract_append |
6.338 s | 7.179 s | +13.3% (1.13× slower) |
26.634 s | 32.591 s | +22.4% (1.22× slower) |
60.300 | 49.280 | -18.3% (1.22× slower) |
53.24 GiB | 63.99 GiB | +20.2% (1.20× larger) |
5.01 MiB | 6.85 MiB | +36.9% (1.37× larger) |
28.3 ms | 39.0 ms | +37.5% (1.38× slower) |
95.20B | 116.63B | +22.5% (1.23× more) |
Char.ofOrdinal_le_of_le |
6.163 s | 6.939 s | +12.6% (1.13× slower) |
29.325 s | 32.200 s | +9.8% (1.10× slower) |
94.220 | 85.810 | -8.9% (1.10× slower) |
62.76 GiB | 65.23 GiB | +3.9% |
5.16 MiB | 7.01 MiB | +35.8% (1.36× larger) |
29.3 ms | 39.5 ms | +34.9% (1.35× slower) |
95.52B | 102.31B | +7.1% (1.07× more) |
Std.HashMap |
3.957 s | 4.216 s | +6.5% (1.07× slower) |
17.235 s | 18.813 s | +9.2% (1.09× slower) |
118.480 | 108.540 | -8.4% (1.09× slower) |
36.50 GiB | 38.89 GiB | +6.5% (1.07× larger) |
5.08 MiB | 7.00 MiB | +37.8% (1.38× larger) |
28.6 ms | 38.0 ms | +33.0% (1.33× slower) |
61.01B | 64.67B | +6.0% (1.06× more) |
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq |
3.545 s | 3.885 s | +9.6% (1.10× slower) |
16.096 s | 18.247 s | +13.4% (1.13× slower) |
115.990 | 102.320 | -11.8% (1.13× slower) |
35.07 GiB | 37.35 GiB | +6.5% (1.06× larger) |
5.05 MiB | 6.98 MiB | +38.2% (1.38× larger) |
29.0 ms | 40.3 ms | +38.6% (1.39× slower) |
55.56B | 59.28B | +6.7% (1.07× more) |
String.append |
434.1 ms | 457.7 ms | +5.4% (1.05× slower) |
1.793 s | 1.953 s | +8.9% (1.09× slower) |
182.420 | 167.470 | -8.2% (1.09× slower) |
4.84 GiB | 5.69 GiB | +17.6% (1.18× larger) |
4.80 MiB | 6.63 MiB | +38.0% (1.38× larger) |
27.6 ms | 36.2 ms | +31.2% (1.31× slower) |
3.45B | 3.42B | -0.6% |
Nat.add_comm |
262.2 ms | 269.6 ms | +2.8% | 741.7 ms | 759.5 ms | +2.4% | 62.020 | 60.570 | -2.3% | 4.43 GiB | 4.09 GiB | -7.6% (1.08× smaller) 🟢 | 4.60 MiB | 6.39 MiB | +38.8% (1.39× larger) |
25.4 ms | 33.4 ms | +31.5% (1.32× slower) |
320.32M | 286.98M | -10.4% (1.12× fewer) 🟢 |
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 |
2.463 s | 2.694 s | +9.4% (1.09× slower) |
21.961 s | 27.728 s | +26.3% (1.26× slower) |
126.360 | 100.080 | -20.8% (1.26× slower) |
56.66 GiB | 71.32 GiB | +25.9% (1.26× larger) |
2.20 MiB | 3.78 MiB | +71.7% (1.72× larger) |
12.2 ms | 19.9 ms | +63.2% (1.63× slower) |
110.55B | 98.89B | -10.6% (1.12× fewer) 🟢 |
Array.extract_append |
2.377 s | 2.658 s | +11.8% (1.12× slower) |
20.960 s | 27.266 s | +30.1% (1.30× slower) |
76.620 | 58.900 | -23.1% (1.30× slower) |
54.60 GiB | 68.72 GiB | +25.9% (1.26× larger) |
2.20 MiB | 3.78 MiB | +71.8% (1.72× larger) |
12.3 ms | 20.9 ms | +69.5% (1.70× slower) |
105.50B | 96.17B | -8.8% (1.10× fewer) 🟢 |
Char.ofOrdinal_le_of_le |
2.510 s | 2.740 s | +9.2% (1.09× slower) |
21.645 s | 27.655 s | +27.8% (1.28× slower) |
127.650 | 99.910 | -21.7% (1.28× slower) |
56.84 GiB | 70.07 GiB | +23.3% (1.23× larger) |
2.21 MiB | 3.78 MiB | +70.9% (1.71× larger) |
13.6 ms | 20.3 ms | +49.4% (1.49× slower) |
110.68B | 98.96B | -10.6% (1.12× fewer) 🟢 |
Std.HashMap |
2.491 s | 2.664 s | +7.0% (1.07× slower) |
21.290 s | 27.459 s | +29.0% (1.29× slower) |
95.910 | 74.370 | -22.5% (1.29× slower) |
55.14 GiB | 70.02 GiB | +27.0% (1.27× larger) |
2.20 MiB | 3.78 MiB | +71.9% (1.72× larger) |
12.5 ms | 19.6 ms | +56.6% (1.57× slower) |
108.13B | 97.81B | -9.5% (1.11× fewer) 🟢 |
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq |
2.468 s | 2.689 s | +9.0% (1.09× slower) |
21.297 s | 27.687 s | +30.0% (1.30× slower) |
87.660 | 67.430 | -23.1% (1.30× slower) |
54.67 GiB | 70.08 GiB | +28.2% (1.28× larger) |
2.19 MiB | 3.79 MiB | +72.5% (1.73× larger) |
12.3 ms | 20.2 ms | +63.6% (1.64× slower) |
107.01B | 97.66B | -8.7% (1.10× fewer) 🟢 |
String.append |
2.205 s | 2.548 s | +15.5% (1.16× slower) |
19.640 s | 20.062 s | +2.2% | 16.650 | 16.300 | -2.1% | 50.68 GiB | 50.65 GiB | -0.1% | 2.21 MiB | 3.78 MiB | +70.8% (1.71× larger) |
12.5 ms | 20.0 ms | +59.3% (1.59× slower) |
96.08B | 90.94B | -5.3% (1.06× fewer) 🟢 |
Nat.add_comm |
2.172 s | 2.342 s | +7.8% (1.08× slower) |
19.767 s | 19.836 s | +0.4% | 2.330 | 2.320 | -0.4% | 50.76 GiB | 48.83 GiB | -3.8% 🟢 | 2.21 MiB | 3.78 MiB | +70.8% (1.71× larger) |
12.3 ms | 20.1 ms | +63.5% (1.63× slower) |
90.48B | 84.24B | -6.9% (1.07× fewer) 🟢 |
Aggregate flat join (7 constants)
| constant | execute-time (main) | execute-time (PR) | Δ% | prove-time (main) | prove-time (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 |
n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
Array.extract_append |
n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
Char.ofOrdinal_le_of_le |
n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
Std.HashMap |
n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq |
n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
String.append |
n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
Nat.add_comm |
n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | n/a | 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 |
57.274 s | 1m 8.3s | +19.2% (1.19× slower) |
48.450 | 40.650 | -16.1% (1.19× slower) |
72.49 GiB | 78.57 GiB | +8.4% (1.08× larger) |
Array.extract_append |
47.594 s | 59.856 s | +25.8% (1.26× slower) |
33.740 | 26.830 | -20.5% (1.26× slower) |
54.60 GiB | 68.72 GiB | +25.9% (1.26× larger) |
Char.ofOrdinal_le_of_le |
50.970 s | 59.855 s | +17.4% (1.17× slower) |
54.210 | 46.160 | -14.8% (1.17× slower) |
62.76 GiB | 70.07 GiB | +11.7% (1.12× larger) |
Std.HashMap |
38.525 s | 46.272 s | +20.1% (1.20× slower) |
53 | 44.130 | -16.7% (1.20× slower) |
55.14 GiB | 70.02 GiB | +27.0% (1.27× larger) |
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq |
37.393 s | 45.933 s | +22.8% (1.23× slower) |
49.930 | 40.650 | -18.6% (1.23× slower) |
54.67 GiB | 70.08 GiB | +28.2% (1.28× larger) |
String.append |
21.432 s | 22.015 s | +2.7% | 15.260 | 14.850 | -2.7% | 50.68 GiB | 50.65 GiB | -0.1% |
Nat.add_comm |
20.508 s | 20.596 s | +0.4% | 2.240 | 2.230 | -0.4% | 50.76 GiB | 48.83 GiB | -3.8% 🟢 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Aiur could accept supplied traces for false public results or recursive calls
with no finite execution. This PR repairs four demonstrated trace defects
and a native Merkle commitment-binding defect. Regression tests construct
the offending witnesses and openings directly.
The implementation also reduces the cost of the repaired system through
checked call-order specialization, narrower rank and byte lookups, BLAKE3
and arithmetic changes, and smaller host data structures. Across 83 kernel
fixtures, summed raw FFT cost is 41.17% below the initial repair and
1.72% below original main. Proving time and memory vary by workload.
In its matched comparison, BLAKE3 unrolling improves
Vector.appendprovingtime at the cost of 19.93–34.40% larger proofs across five claims and
slower verification.
Soundness repairs
Inactive rows cannot supply results. Enforce
multiplicity * (1 - selector) = 0on function and memory rows. Thisrejects the supplied witness for
3 * 5 = 16and covers every groupedmember. It adds a quadratic constraint without widening traces or lookups.
Regressions.
Calls require a well-founded order. Every constrained call advances a
checked static component order, increases a bounded 48-bit rank within a
recursive component, or satisfies a checked unit-step relation on a
self-edge. This rejects self-supporting and mutually recursive witnesses.
Honest recursion, shared callees and advice promotion remain supported.
Regressions.
Lookup messages have checked shapes. Validate public entry visibility,
claim and call input/output arities, and continuation yields. This prevents
zero padding from interpreting an empty return's rank seven as output
seven. Entry shapes are cached at construction; these guards add no AIR
columns or FFT work.
Regressions.
Only terminal single-function circuits omit lookup argument gates.
Having one selector was insufficient: an empty branch could still write a
store lookup and change a live message's channel. Branching circuits now
retain their gates. Degree-aware grouping accounts for those gates when
choosing the lookup layout.
Regressions.
Merkle caps must authenticate every active matrix. For trace
log-degrees
d, log-blowupband cap heightc, requiremin(c, b + max(d)) <= b + d_ifor each matrix. This rejects caps thatomit a shorter matrix's injection layer, including the supplied altered
openings. The guard adds no trace columns or FFT work; default cap zero
takes a constant-time check. The recursive verifier already requires zero.
Regressions.
Construction also checks control/selector counts and component assignments.
Verification bounds lookup consumers below the field characteristic and
requires both byte tables to be active at their exact fixed heights. These
supporting guards make the counting and range assumptions explicit.
Within a ranked component, a call requests
caller_rank + 1 + gapand thecallee return binds that rank. Three u16 limbs bound both rank and gap below
2^48; their sum stays below the Goldilocks characteristic. Cross-componentcalls still bind the callee's rank. Independently checked component and
unit-counter certificates leave 322 of 759 constrained functions ranked
in the final IxVM program. Unsupported recursion keeps dynamic ranks.
The Lean theorems establish order and cycle results under their stated row
relations. Compiler/native checks and supplied-trace tests cover the
implementation boundary; complete compiler-to-AIR preservation and
cryptographic soundness remain outside those theorems. The precise
invariants are in the soundness notes.
Final modeled FFT cost
Measured on 2026-09-13–14 UTC. Baselines are fixed revisions: original main
58eb0977, initial repair79d8764c, and final branch585cea90.Raw costs model transform work using each revision's native compiled shapes
and executed unique-query counts on identical fixtures. Proving measurements
appear separately below. Original main predates the repairs.
Nat.add_commVector.appendShard pipelineAll 83 kernels improve over the initial repair, with 31.36% median reduction
and a 16.77–59.07% range. Compared with original main, 80 are cheaper.
The three regressions are
Array.append_assoc(+7.86%),Vector.append(+7.57%) and
IxVMPerf.context_tower(+5.61%). The shard pipeline ismeasured separately from the 83-kernel distribution.
FFT cost by change
Each row gives absolute raw FFT costs after that change. Host-memory and
query-storage changes preserve the FFT pins; the query-storage row includes
the substitution rollback. Temporary substitution and regrouping layouts
are excluded from this retained sequence.
Nat.add_commVector.appendmain(58eb0977)79d8764c)6385126f)288c4c2b)c7a5a979)470eaea2)9ad3e2a8)07c84d4c)a3c1c95b)34baee46)ec8432ee)9c8a6545)1e881534)e1d74d12)da9ab1a1)09e95317)585cea90)The full 83-kernel distribution catches effects that the three representative
workloads can hide:
79d8764c→6385126f6385126f→288c4c2b288c4c2b→c7a5a9799ad3e2a8→07c84d4c07c84d4c→a3c1c95b34baee46→ec8432eeec8432ee→9c8a65459c8a6545→1e8815341e881534→e1d74d12e1d74d12→da9ab1a1da9ab1a1→09e9531709e95317→585cea9079d8764c→585cea90Reductions use the stated before/after revisions. A negative reduction is a
regression; unchanged fixtures are included when calculating the median.
The combined median is calculated from final versus initial costs for each
fixture, independently of the per-step medians. The shard is separate.
Raw FFT cost uses unique-query heights. The padded comparison rounds each
nonempty function/memory height to a power of two and keeps byte tables at
their fixed heights. It includes advice queries and does not separately
filter inactive rows. Both are transform-work models; measured proving time
also includes execution, witness construction and non-FFT arithmetic.
The retained changes reduce work as follows:
Each percentage in this table compares that change with its immediate
baseline. The final table above measures the combined branch directly.
Proving time, memory and tradeoffs
The BLAKE3 compression comparison uses 80 verified proofs: five claims,
four layouts and four rounds, rotating each layout through every run
position. The table reports four-round medians for
e1d74d12→da9ab1a1(original compression → full unrolling). These timings belong to that
optimization; the two subsequent changes are reported separately below.
NatNat.add_commVector.appendIxVMPrim.nat_mul_bigIxVMPerf.mul_wideVector proves faster in every matched pair, with non-overlapping time
ranges (6.898–7.058 s → 6.581–6.867 s) and lower process peaks. A separate
earlier 30-proof comparison also verifies and observes 5.00% faster
Vector proving and 3.53% lower process peak RSS. The smaller claims have
overlapping time ranges and nearly unchanged process peaks.
Full unrolling grows proofs 19.93–34.40% and raises verification medians
16.07–21.54% in this comparison. Two-round and four-round layouts save less
kernel FFT work
(3.38% and 5.51% raw), with smaller proof growth (4.15–7.23% and
12.40–21.27%). Full unrolling is retained for its FFT and large-workload
proving gains; all byte operations and checks are preserved.
Other measured effects are summarized below. These are separate matched
experiments at their stated revisions; their timing percentages are not
combined into a branch-wide speedup.
c7a5a979→470eaea2)470eaea2→9ad3e2a8)10a4ba50→cd1df1e5)5e2f65f1→34baee46)07c84d4c→a3c1c95b)9c8a6545→1e881534)1e881534→e1d74d12)da9ab1a1→09e95317)09e95317→585cea90)Packed storage uses canonical byte/u32/full-field columns and widens when
a value requires it. Direct encoding/decoding, implicit memory outputs and
hash reuse reduce overhead while retaining exact key equality and completion
semantics. The RAM estimator now sums grouped rows correctly and includes
extension-field, row-writer and metadata storage. Its historical 43/40 RSS
calibration still needs full-scale validation against the pinned prover.
Substitution-prefix sharing was reverted and function regrouping was not
retained: their small model gains did not justify the measured time, memory
or proof-size costs. Production uses complete substitution keys; their
semantic regressions remain.
The real proof matrices use frozen executables and identical serialized
claims, eight Rayon workers, blowup four, cap zero, 100 FRI queries,
final-polynomial log length zero, maximum log arity one and no proof of work.
The prove timer includes execution, witness construction and STARK proving;
loading, setup, the separate execution pass, serialization and verification
are outside it. Process RSS is GNU time's whole-process high-water mark.
Sampled prove-window peaks cover a different scope and show mixed changes.
The four-layout compression matrix encountered other host activity, so
small timing differences remain uncertain. Results from separate timing
windows are reported independently.
Compatibility and validation
Rebuild Lean and Rust systems, all three generated executors, and
verification keys together, then regenerate proofs. The branch changes
AIR/lookup layouts, the internal component metadata, some function indices
and private helper arities. Public claim encoding and hash results are
preserved. Malformed claims, metadata and unsafe cap configurations now reject.
proofs, recursive verification, arithmetic, hashing and aggregation.
executor parity, all 83 kernel plus shard FFT pins, and production/full
component certificates.
91 Aiur and seven generated-executor tests; four opt-in benchmarks remain
ignored in the normal suite.
three-vertex graphs; native counter tests cover 4,096 graph/rank cases.
Range/byte tests exhaust all 65,536 values or pairs and exercise forged
limbs, cross-channel messages, inactive rows and decoded keys. New u32
comparisons also reject supplied witnesses that satisfy the local
polynomials but violate a limb bound, and cover advice promotion.
boundaries, remainders and wrong digests. All 80 proofs across four
compression layouts and 30 earlier unroll proofs verify with exact
FFT references; the two timing windows are reported separately.
All 40 matched u32-comparison proofs and 16 Vector follow-up proofs
also verify with exact references, as do the 40 lowering-helper proofs.
Two additional binding proofs cover whole and nested Let lowering.
ix-ffi/parallel,ix-ffi/net,ix-ffi/test-ffi, Rust formatting, and freshnesschecks for all three generated executors pass (799/262/263 functions).
Validation commands
All 83 kernel FFT measurements
Integer-rounded raw costs for the fixed revisions above. The final column
uses original main as its denominator; reductions use the initial repair.
HEqHEq.recEq.recNatNat.addNat.add_commNat.decEqNat.decLeNat.sub_le_of_le_addNat.shiftRight_succTrans.mkArray.append_assocVector.appendIxVMPrim.nat_add_litIxVMPrim.nat_sub_litIxVMPrim.nat_mul_litIxVMPrim.nat_mul_bigIxVMPrim.nat_div_litIxVMPrim.nat_mod_litIxVMPrim.nat_succ_litIxVMPrim.nat_pred_litIxVMPrim.nat_gcd_litIxVMPrim.nat_land_litIxVMPrim.nat_lor_litIxVMPrim.nat_xor_litIxVMPrim.nat_shl_litIxVMPrim.nat_shr_litIxVMPrim.nat_pow_bigIxVMPrim.nat_beq_litIxVMPrim.nat_ble_litIxVMPrim.nat_cases_bigIxVMPrim.nat_dec_leIxVMPrim.nat_dec_ltIxVMPrim.nat_dec_eqIxVMPrim.str_size_litIxVMPrim.bv_to_nat_litIxVMInd.EvenIxVMInd.OddIxVMInd.Even.recIxVMInd.Odd.recIxVMInd.IdxTeleN.recIxVMInd.IdxTeleB.recIxVMInd.SoloA.recIxVMInd.SoloB.recIxVMInd.UnsafeSquashIxVMInd.TreeIxVMInd.Tree.recIxVMInd.DedupMIxVMInd.DedupM.recIxVMInd.DepthMIxVMInd.DepthM.recString.Internal.append_private.Init.Prelude.0.Lean.extractMainModule._unsafe_recLean.Syntax.recIxVMInd.AuxTieIxVMInd.AuxTie.recIxVMInd.HiddenIdxIxVMInd.HiddenIdx.recIxVMInd.thmMajorUseIxVMInd.partialKRecIxVMInd.deepRebaseString.Slice.Pattern.Model.NoPrefixPatternModel.recLean.Widget.TaggedText.recLean.Doc.Part.recLean.Doc.Block.rec_private.Tests.Ix.Compile.Mutual.0.Tests.Ix.Compile.Mutual.AuxDedup1.A_private.Tests.Ix.Compile.Mutual.0.Tests.Ix.Compile.Mutual.AuxDedup1.A.rec_private.Tests.Ix.Compile.Mutual.0.Tests.Ix.Compile.Mutual.AuxDedup1.A.rec_1_private.Tests.Ix.Compile.Mutual.0.Tests.Ix.Compile.Mutual.AuxDedup1.A.rec_2_private.Tests.Ix.Compile.Mutual.0.Tests.Ix.Compile.Mutual.AuxDedup2.A.rec_1_private.Tests.Ix.Compile.Mutual.0.Tests.Ix.Compile.Mutual.AuxDedupMixed.M_private.Tests.Ix.Compile.Mutual.0.Tests.Ix.Compile.Mutual.AuxDedupMixed.M.rec_private.Tests.Ix.Compile.Mutual.0.Tests.Ix.Compile.Mutual.AuxDedupMixed.M.rec_1_private.Tests.Ix.Compile.Mutual.0.Tests.Ix.Compile.Mutual.AuxDedupMixed.M.rec_2strOfListFoldSizestrOfListFoldSizeAsciiIxVMPrim.lazy_ble_offsetIxVMPrim.lazy_unit_castIxVMPrim.sizeof_unitIxVMPerf.let_continuationsIxVMPerf.mul_rowIxVMPerf.context_towerIxVMPerf.mul_wide