Skip to content

Jcb/ix-certified-v3 followup: Formalize nominal-to-quotient Source bridge, optimize compiler/kernel, and retire uncertified Rust/Lean pipelines - #677

Merged
arthurpaulino merged 1485 commits into
mainfrom
jcb/ix-certified-v3-followup
Nov 6, 2026
Merged

arthurpaulino merged 1485 commits into
mainfrom
jcb/ix-certified-v3-followup

Conversation

@johnchandlerburnham

@johnchandlerburnham johnchandlerburnham commented Nov 2, 2026 •

Copy link
Copy Markdown
Member

Formalize nominal-to-quotient Source bridge, optimize compiler/kernel, and retire uncertified Rust/Lean pipelines

Summary

Following the merge of #665 (3c8999c18), this PR delivers:

  1. Raw Lean.Environment Ingress, Collapsed-Trace Characterization & Conditional Nominal-to-Quotient Pullback (Ix.Cert.Canon, Ix.LeanIngress.Theorems, Ix.LeanIngress.Rename, Ix.LeanIngress.NominalQuotient, Ix.Cert.Quotient, Ix.Cert.CompileCorrect, Ix.Cert.ModuleAudit, Ix.Cert.Audit)
  2. GraphM, CondenseM, Compiler, Finalizer, Serializer, and IxC Kernel Performance Optimizations
  3. Aggregation Self-Assumption & Duplicate-Discharge Hardening (Ix.Aggr.Circuit, Ix.Aggr.Host, Ix.IxVM.Kernel.Claim, Tests.Aggr)
  4. Retirement of the Uncertified Rust Compiler, Out-of-Circuit Rust Kernel, Unused ShardMap, and Redundant/Formally-Subsumed Test Suites (merge-queue matrix streamlined from 9 partitions to 4)
  5. Custom User Axioms, Strict by Default (IxC.Kernel.Cached.Policy, IxC.Kernel.Admission.UserAxioms, Ix.RoleBinding.UserAxioms, ix check-lean --allow-user-axioms, CONDITIONAL verdict with exit 5)
  6. Follow-Up Review Fixes: faster kernel check and finalize, the compile-export regression fixed, every merge-queue tier green, a lighter CI workload, Blake3 digests throughout, more dead code removed, and design docs rewritten against the Lean code

1. Raw Lean.Environment Ingress & Nominal-to-Quotient Source Bridge

  1. Raw Lean.Environment to Ix.Environment Ingress Theorems (Ix/Cert/Canon.lean):

    • Defines direct Source-mode readings on raw Lean constants (leanConstantVal, leanAxiomVal, leanQuotVal, leanDefinitionVal, leanTheoremVal, leanOpaqueVal, leanInductiveVal, leanConstructorVal, leanRecursorRule).
    • Proves that Ix.LeanIngress.convertAxiom, Ix.LeanIngress.convertQuotient, and single-member Ix.LeanIngress.convertDefinitions on canonicalized Ix.ConstantInfo agree with the direct raw-Lean readings (ingressConstantVal_constValS, convertAxiom_axiomValS, convertQuotient_quotValS, convertDefinitions_defnValS, convertDefinitions_thmValS, convertDefinitions_opaqueValS, ingressInductiveVal_inductValS, ingressConstructorVal_ctorValS, ingressRecursorRule_recRuleS).
  2. Pure Canonicalization, Quotient Commutation & Shared substKeys Lemmas (Ix/LeanIngress/Theorems.lean, Ix/LeanIngress/Rename.lean):

    • Characterizes Ix.CanonM expression and declaration canonicalization via pure functions (canonExprM, canonValM, DefMember.canon, canonInfo, BlockRead.canon, Converted.canon, canonDecl), proves conditional idempotence (*_idem, given level-canonicalizer idempotence hf), and proves that Converted.quotient σ equals substKeys σ after pure canonicalization (Converted.quotient_eq_substKeys_canon, BlockRead.canon_substKeys, DefMember.canon_substKeys, canonDecl_substKeys).
    • Consolidates ConstantVal.substKeys_*, ConstantInfo.substKeys_*, RecRule.substKeys_*, and BlockRead.substKeys_names @[simp] lemmas into Ix/LeanIngress/Rename.lean.
  3. Collapsed-Trace Characterization & Conditional Nominal Pullback (Ix/LeanIngress/NominalQuotient.lean, Ix/Cert/Quotient.lean, Ix/Cert/CompileCorrect.lean, Ix/Cert/ModuleAudit.lean, Ix/Cert/Audit.lean):

    • Unconditional collapsed-trace soundness (prepareSourceCollapsedAt_trace): proves that every step in a successful quotient Source preparation (prepareSourceCollapsedAt) either keeps a fresh declaration/block or drops an alias declaration/block that is structurally identical (Declaration.beqF / BlockRead.beqF, hence =) to an already-kept representative after applying Key.subst (fiberAliasAt ixe (roleAtMap t)). Together with CompileCorrect (which unconditionally transports both ValueModel and LawModel between quotient Source envQ and compiled Ixon envA), this completes the primary security guarantee.
    • Pre-lowering fiber safety & conditional model pullback: defines GroupIntraInjective, HintsAgreeAt, and FiberAliasSafe (checkGroupFiberSafe, checkGroupFiberSafe_sound), and proves conditional pullback corollaries (EnvSubstRel.toModelPullback, IxonCommutesCovering.nominalBridgeAt, IxonCommutesCovering.nominalPullback, NominalSemanticBridgeAt.of_covering, CompileCorrect.nominalBridgeAt, CompileCorrect.nominalPullback) showing how ValueModel (from EnvSubstRel) and LawModel (given LawModel.Rel in EnvSubstPullback) pull back from envQ to a nominal envS accepted by SourceAccepts. (Deriving LawModel.Rel from EnvSubstRel and discharging EnvSubstRel from FiberAliasSafe on closures whose alias fibers do not mix reducibility hints is left for future work.)
    • Freezes all new theorem statements in Ix/Cert/Audit.lean (#guard_msgs in #check) and pins their axioms in Ix/Cert/ModuleAudit.lean (#guard_module_axioms and #guard_kernel_axioms with [propext, Classical.choice, Quot.sound]).

2. GraphM, CondenseM, Compiler, Finalizer, Serializer, and IxC Performance

  1. Single-Accumulator GraphM & Direct-Component CondenseM (Ix/GraphM.lean, Ix/Cert/GraphWalk.lean, Ix/Cert/RecursorIndexFacts.lean, Ix/CondenseM.lean, Ix/Cert/Condense.lean, Ix/Cert/GroupRefs.lean, Ix/Cert/TraceFold.lean):

    • Replaces per-subexpression HashSet allocations and HashSet.union merges in Ix.GraphM with a single-accumulator walk (graphExprAcc) that records visited expressions in a Std.HashSet ExprKey (keyed by cached 64-bit hash with full structural LawfulBEq equality) and skips already-traversed DAG subtrees while preserving the pure specification Graph.env and GraphWalk proofs (1.77× faster than the pre-retirement Rust implementation on graph-cross).
    • Simplifies Ix.CondenseM now that mutual blocks preserve discovery/source order: removes the unused rootName and byDiscovery hash maps and redundant self-loop filters, constructing scc.blocks directly when popping an SCC root (1.26× faster than the pre-retirement Rust implementation on condense-cross).
  2. O(1) Loose-BVar Cutoffs in IxC.Kernel.ExprOps (IxC/Kernel/ExprOps.lean, IxC/Kernel/Expr.lean):

    • Adds e.bvarB ≤ d early cutoffs in instantiate1Go/instantiate1Fast, instantiateListGo/instantiateListFast, and liftLooseBVarsGo/liftLooseBVarsFast, plus root cutoffs in abstract1Fast, lowerBVarsFast, instantiate1LiftFast, and instLPFast, with full correctness and @[csimp] proofs.
  3. Parallel Pre-Read, Unified Role-Binding Admission & O(1) Pool Installation (Ix/KernelCheck/Binding.lean, Ix/KernelCheck/Stream.lean, Ix/KernelCheck/Step.lean, Ix/KernelCheck/Pool.lean, Ix/KernelCheck/Run.lean, Ix/Ixon/CheckOrder.lean, Benchmarks/Kernel/CheckIxe.lean):

    • Parallelizes Ix.KernelCheck.Stream.load via chunk-parallel decodeChunk and preReadChunk (preReadRecord) tasks so state-independent Expr .anon DAGs are constructed in parallel before Phase A, cutting sequential Phase A time on Init+Std from 50.83s → 31.21s (-19.62s / -38.6%) and total 32-worker kernel-check-ixe time from 66.10s → 46.27s (-19.84s / -30.0%).
    • Replaces per-step Env.consts clones in Ix.KernelCheck.Pool with O(1) visibleBelow tracking, pre-computes tierAddresses during load, optimizes fastKeysOf, buildIndex, and CheckOrder, makes CheckIxeMeta.displayTable lazy, and buffers Pass 2 JSONL output writes (flushing on completion and watchdog exit).
  4. Incremental finalize Filtering, recordBlockFast & putNamedEntries Fusion (Ix/Compile/ExactKey.lean, Ix/Compile/ReadyQueue.lean, Ix/Compile/ReadyCompile.lean, Ix/Cert/Compile.lean, Ix/RoleBinding/Compile.lean, Ix/RoleBinding/Generate.lean, Ix/Ixon.lean):

    • Short-circuits ExactKey.preseedKeyBEq via contextHash and overlaps validationTask with ReadyQueue.run.
    • Filters addedConsts in Ix.RoleBinding.Compile.finalize by !artifact.consts.contains a to eliminate false-positive hasNewRec and hasNewDPrj full-env scans on Init+Std, proves and wires recordBlockFast (recordBlockFast_eq) in unownedRecursorWith, skips redundant Canonical.deConstant in Generated.emit, deduplicates sliceSupportClosure, and fuses putNamedEntries mask and byte sizing in Ix.Ixon.

3. Retirement of Uncertified Rust/Lean Pipelines & Test Suite Streamlining

With the certified Lean compiler (Ix.CompileCertified) and certified IxC kernel checker (Ix.KernelCheck) established as the sole compilation and verification engines (and the pre-retirement Rust implementation archived on jcb/archive-rust-compiler-kernel), this PR removes the following (the PR's whole diff is -128,043 net lines across 514 files):

  • Static DAG Sharding Relocated to crates/ixon (crates/ixon/src/shard.rs, crates/ffi/src/lean_ixon.rs):
    • Moves pure-ixon static DAG sharding (ShardManifest, AggNode, LeafRefinement, shard_static, shard_static_ordered, shard_static_graph, shard_manifest_explicit, shard_manifest_refine, build_sub_env*) and the shared input_contracts test fixtures from crates/kernel into crates/ixon, and moves the 5 static sharding FFI entrypoints (rs_env_extract, rs_shard_env_static, rs_shard_manifest_from_partition, rs_shard_manifest_refine, rs_shard_static_graph) into crates/ffi/src/lean_ixon.rs.
  • Rust Crates, FFI Submodules & Experimental ShardMap Deleted:
    • Deletes crates/compile (32,571 lines) and crates/kernel (62,672 lines) from the Cargo workspace.
    • Deletes compiler/kernel-only crates/ixon modules (sharing_exact*, resource*, canon_univ.rs, contract/source.rs) and crates/common modules (env.rs, name_table.rs).
    • Deletes crates/ffi/src/{compile,kernel,graph,lean_env,lean_build,builder,ix*,lean_ixon/sharing,lean_ixon/compare}.rs (11,222 lines) and removes 40 C-ABI @[extern] symbols.
    • Deletes the unused experimental Ix/ShardMap.lean library, Tests/ShardMap.lean, and Benchmarks/ShardMap.lean.
  • Lean Pipeline, CLI, and CI / Merge-Queue Test Suites Streamlined:
    • Migrates DecompileDriver.lean, ImportIxe.lean, Check.lean, IxEval.lean, Commit.lean, ClaimHarness.lean, Apps/ZKVoting/Prover.lean, and CLI commands (decompile, validate-lean, compile-export, bench, addr-of) to the certified Lean compiler and IxC checker (ix check-lean, including --json, --json-name, and --per-const benchmark reporting).
    • Deletes Ix/CompileResource.lean, Ix/Cli/DriverOptions.lean, Ix/Cli/CheckRsCmd.lean (ix check-rs), Ix/Cli/ProfileCmd.lean (ix profile), and Ix/Cli/IngressCmd.lean (ix ingress).
    • Prunes ~42 test suites that tested the retired Rust compiler/kernel or uncertified Lean compiler internals now formally subsumed by CompileCorrect, Ix.CompileCert, IxSharingVerify, Ix.Cert.FreshSnapshot, and Ix.Compile.ReadyCompile.reportIO (retaining kernel-record-check and compile-ind-flags in .primary), and streamlines .github/workflows/merge-tests.yml from 9 matrix partitions down to 4 (ci:compiler-closures, ci:misc, ci:landing-initstd-cli, and Certified kernel) plus Valgrind FFI. docs/ci.md ("Retired suites") records each retired suite and what covers it now. Certification proves soundness; completeness and behaviour at scale are exercised by the real-corpus runs (initstd-reference, fidelity-initstd).

4. Custom User Axioms (Strict by Default)

ix check-lean and kernel-check-ixe decline every axiom outside the standard roles unless --allow-user-axioms is given. With the flag, an accept that depends on user axioms is reported as CONDITIONAL and lists those axioms. It is never reported as certified.

  1. One Axiom Policy in the IxC Fold (IxC/Kernel/Cached/Policy.lean, IxC/Kernel/Admission.lean, IxC/Kernel/Admission/UserAxioms.lean):
    • Cached.AxiomPolicy (.strict / .allowUser) parameterises a single axiom arm (checkAxiomDeclC). Admission.checkBytesUnder, checkConstantsUnder and the tiered checkBytesTieredUsingUnder / checkConstantsTieredUnder return the checked environment together with the user axioms the accept depends on.
    • Under .allowUser, the fold declines an axiom whose type restates the pinned specification of propext, Classical.choice, sorryAx or Quot.sound (axiomRoleSpecHit?). Admission refuses the policy unless the role table binds sorryAx, propext and Classical.choice (admitAxiomPolicy, Error.axiomRoleUnbound). Together these close a path where an unbound sorryAx, read as an ordinary axiom, was admitted.
    • Theorems (statements frozen in IxC/Kernel/Audit/Roots.lean):
      • checkDeclsUnder_eq_checkDecls: without user axioms, the fold under any policy is the certified fold, with the same verdict, environment and failure.
      • checkDecls_iff_userAxioms: the certified fold accepts exactly when the user-axiom fold accepts with no user axioms.
      • checkBytesUnder_strict_of_nil and checkBytesTieredUsingUnder_strict_of_nil: an .allowUser run that reports no user axioms yields the strict entry's certified Receipt / TierReceipt.
      • checkBytesUnder_has_model_of_nil (IxC/Kernel/Admission/UserAxioms/Model.lean): an accept under any policy that lists no user axiom has a model in every set theory.
  2. Host and CLI (Ix/RoleBinding/UserAxioms.lean, Ix/RoleBinding/Artifact.lean, Ix/Cli/CheckLeanCmd.lean, Benchmarks/Kernel/CheckIxe.lean):
    • The flag's role check. --allow-user-axioms first runs the kernel's admitAxiomPolicy .allowUser on the artifact's role binding. A refusal exits 3 in check-lean and 2 in kernel-check-ixe. Every path to the record-by-record checker (Ix.KernelCheck.Step / Pool / Run) runs after this check.
    • One kernel run. With the flag, a whole-artifact run calls the kernel's conditional entry once.
      • An empty axiom list becomes the certified receipt through the corollaries above and issues the host statement, exactly as a strict run would.
      • A non-empty list prints CONDITIONAL on K user axioms, with each axiom's address (and its name in meta mode). The run exits 5 and refuses --host-out / --host-store.
    • Frozen closure. The conditional entries can now lead to a host statement, so their runtime closure is frozen like the strict entries' (6,972 compiled functions).
  3. Init+Std:
    • Strict check-lean passes 99,514 of 99,519 subjects and exits 3. Lean.trustCompiler declines as a non-standard axiom, and Lean.reduceNat, Lean.ofReduceNat, Lean.reduceBool and Lean.ofReduceBool are blocked by it. initstd-reference pins exactly this refused set.
    • With --allow-user-axioms, the run is CONDITIONAL on Lean.trustCompiler, Lean.ofReduceNat and Lean.ofReduceBool, and exits 5 (2:27 wall).

5. Follow-Up Review Fixes

  1. Kernel-Check and Compile Performance (Ix/KernelCheck/Pool.lean, Ix/KernelCheck/Stream.lean, Ix/RoleBinding/Artifact.lean, Ix/RoleBinding/Compile.lean, Ix/Compile/ReadyQueue.lean):

    • Phase A no longer copies the pending-declaration array once per declaration.
    • Load:
      • The parallel decode no longer contends on the shared file buffer's reference count, because each record now decodes from its own bytes.
      • prepareRecords decodes in parallel. decodeRecordsPar_eq and prepareRecordsPar_eq prove it computes the same value.
    • finalize compiles the role certificates during the source compile on whole-environment compiles (prefetchCertificates).
    • compileReport: published candidates are freed off the publication thread.
    • Output is unchanged. Every .ixe has Blake3 a24fd146…eca9a3. The kernel-check-ixe rows, with their timing fields removed, are byte-identical to the base binary's (98,030 rows).
    • Measured on the 64-core test box, Init+Std, medians of three interleaved runs:
    Metric Before (c9575dca1) After Change
    kernel-check-ixe --jobs 32 load 16.7s 7.0s -58%
    kernel-check-ixe phase A 33.5s 7.0s -79%
    kernel-check-ixe total 57.3s 20.5s -64% (2.8×)
    kernel-check-ixe user CPU 444s 152s -66%
    compile-lean compileReport 31.9s 27.9s -13%
    compile-lean finalize 5.03s 1.78s -65%
    compile-lean total 42.3s 35.2s -17%
  2. ix compile-export Regression Fixed (Ix/CompileCertified.lean, Ix/Cli/CompileExportCmd.lean):

    • The bug. A pre-check against ix's own default role table refused exports from other toolchains (4.29.0, 4.33.1, 4.35.0), whose role closures legitimately differ.
    • The fix. compile-export now skips that pre-check (defaultRoles := false). The artifact's own binding is still checked in finalize, and role generation still checks each role against its certificates.
    • Result. All four toolchain fixtures compile byte-identically to main's, and regression tests cover it.
  3. Merge-Queue Tiers Green. All of these failures were already present at c9575dca1.

    • compiler-selected-closure-e2e, checker-support-regression: the report parser accepts typed rows, which must give a tier safety as their reason.
    • canon-closure-aux: IxC declines an inductive block read without its recursor. A new selected leg type-checks each seed in its self-contained selected closure.
    • kernel-tutorial: 376 passed, 0 failed. The changes:
      • Bad cases are compiled one at a time, not in one fail-closed compile.
      • The native_decide fixtures must not pass under strict.
      • The tutorial's user-axiom fixtures are accepted only conditionally, on exactly their axioms.
      • nestedSpecLocalF is a corner case whose expected outcome is "either", following lean-kernel-arena's corner-cases/nested-nonuniform-param and bugs/nested-unused-param. IxC's decline is pinned with its reason.
      • tut06_bad01 must be rejected in Source mode.
  4. CI Workload (.github/workflows/{ci,nix,merge-tests}.yml, Tests/Main.lean, lakefile.lean):

    • Primary tier: the ixon and exact-sharing suites run their checks concurrently, taking primary from 507.6s to 355.9s on the box.
    • ci:cli: binding-proof-cli (75.6 GB peak) moves to ci:compiler-closures, and compile-determinism compiles with --local. ci:cli goes from 503.8s to 165.4s, and lean-test's memory peak from 75.6 GB to 47.8 GB.
    • nix.yml drops the dev-shell lake test and the flake's clippy and nextest checks, which ci.yml already runs. Ix.Cert.Audit leaves IxTests' import closure and is built by check-kernel.
    • merge-tests.yml builds once per merge group, in a build job whose output the partitions restore.
    • Valgrind runs a new ffi-tests executable: 5:50 under Valgrind, where IxTests ffi hadn't finished after 23.5 min.
    • New admission-hash-diff-initstd (landing) compares native and pure Blake3 admission hashes on every record, blob and the binding of the Init+Std artifact.
  5. Tests:

    • Added: kernel-user-axioms (primary).
    • Re-dropped: suites the review proposed restoring were dropped again wherever a proof or corpus run covers them.
    • Folded in: the record-decoding cases moved into kernel-record-check.
  6. Blake3 Digests Throughout:

    • Replaced SHA-256: Ix.FileDigest.blake3File replaces SHA-256 in initstd-reference, compile-determinism, CheckIxePaired, PinGen and the IxC/Kernel/Ixon/RoleData.lean provenance.
    • RoleData: regenerated; its 3 closure hints now match the generator.
    • AnthropicFLT runner: its manifest needs an artifact.blake3 before its next run.
  7. Dead Code and Stale Docs:

    • Deleted:
      • the streamed source-graph front end;
      • Ix.CanonM.canonEnv;
      • the ix-bench crate;
      • the shardManifestFromPartition chain;
      • IxSharingVerify.UniformCappedSize and its 13 audit roots;
      • rustOnlyLimitKeys;
      • the producerless Rust CompileError / DecompileError;
      • unused KernelCheck plumbing;
      • check-lean's --clear-every / --no-verify.
    • Shared: the certified compile commands now share compileAndFinalize.
    • Docs:
      • The design docs are rewritten against the Lean code.
      • docs/retired-rust.md summarises the retired Rust.
      • docs/certified-compiler-progress.md withdraws the unmeasured 4.65s / 44.6s figures.

Known limitation, deferred. Ix.Cert.RecursorsOwned matches recursors to families by name. So a closure holding HAdd.rec but not HPow.rec is refused, because those alpha-equivalent families merge into one block. A name-free restatement is planned as follow-up work.


Benchmark Results on perfspec (Init+Std, 117,694 inputs / 100,402 records, 32 workers)

These perfspec tables were measured before §§4–5 and were not re-run. For the §5 changes, see its before/after table.

Benchmark / Phase Round 1 Round 2 Round 3 (This PR) Total Improvement
ReadyBenchmark canon 2,210 ms 2,175 ms 2,071 ms -6.3%
ReadyBenchmark compileReport 33,221 ms 29,828 ms 27,478 ms -17.3% (-5.74s, 1.21×)
ReadyBenchmark finalize 5,075 ms 5,307 ms 4,557 ms -10.2% (-0.52s, 1.11×)
ReadyBenchmark serialize 1,264 ms 1,238 ms 1,251 ms -1.0%
ReadyBenchmark total-ms 45,017 ms 41,663 ms 38,613 ms -14.2% (-6.40s, 1.17×)
ReadyBenchmark Process Wall 46.84s 43.62s 40.69s -13.1% (-6.15s)
ReadyBenchmark Peak RSS 7,881 MB 7,698 MB 7,525 MB -39.0% vs PR #665 (12,331 MB)
ReadyBenchmark Output Blake3 a24fd146...eca9a3 a24fd146...eca9a3 a24fd146...eca9a3 Bit-exact
kernel-check-ixe streaming load 6,348 ms 6,348 ms 8,725 ms (incl. parallel preReadRecord) —
kernel-check-ixe phase A 50,829 ms 45,519 ms 31,211 ms -38.6% (-19.62s, 1.63×)
kernel-check-ixe markPersistent 1,675 ms 1,004 ms 972 ms -42.0%
kernel-check-ixe phase B (32w) 3,893 ms 3,522 ms 3,199 ms -17.8% (1.22×)
kernel-check-ixe Pass 2 + tier 3,355 ms 3,254 ms 1,970 ms -41.3% (1.70×)
kernel-check-ixe --jobs 32 Total 66,100 ms 56,120 ms 46,265 ms -30.0% (-19.84s, 1.43×)
kernel-check-ixe Peak RSS 2,879 MB 2,336 MB 2,746 MB -5.5% vs PR #665 (2,905 MB)
graph-cross (182,249 constants, vs archived Rust) 3,954 ms (Rust) 2,232 ms (Lean) 2,232 ms (Lean) 1.77× faster than Rust
condense-cross (182,305 constants, vs archived Rust) 4,864 ms (Rust) 3,859 ms (Lean) 3,859 ms (Lean) 1.26× faster than Rust

Benchmark Results on perfspec (Mathlib, 783,115 inputs, 32 workers, lookahead 8192)

Phase / Metric Pre-PR #665 Baseline PR #665 (jcb/ix-certified-v3) This PR (jcb/ix-certified-v3-followup) Improvement vs PR #665 Improvement vs Baseline
load 6,348 ms 6,506 ms 6,470 ms -0.6% +1.9%
select 136 ms 134 ms 130 ms -3.0% -4.4%
source-contracts 977 ms 985 ms 964 ms -2.1% -1.3%
canon 24,187 ms 23,864 ms 24,476 ms +2.6% +1.2%
compileReport 369,900 ms 341,690 ms 295,635 ms (4m 55.6s) -46,055 ms (-13.5%, 1.16×) -74,265 ms (-20.1%, 1.25×)
finalize 66,435 ms 7,310 ms 6,201 ms (6.20s) -1,109 ms (-15.2%, 1.18×) -60,234 ms (-90.7%, 10.71×)
serialize 42,742 ms 13,225 ms 12,296 ms (12.30s) -929 ms (-7.0%, 1.08×) -30,446 ms (-71.2%, 3.48×)
write 681 ms 696 ms 711 ms +2.2% +4.4%
total-ms 511,430 ms (8m 31.4s) 394,439 ms (6m 34.4s) 346,908 ms (5m 46.9s) -47,531 ms (-12.1%, 1.14×) -164,522 ms (-32.2%, 1.47×)
Process Wall Clock 10:30.02 (630.02s wave) 6:53.34 (413.34s) 6:05.91 (365.91s) -47.43s (-11.5%, 1.13×) -264.11s (-41.9%, 1.72×)
Peak RSS ~110 GiB ~110 GiB 65.68 GiB (67,257,828 kB) -40.3% (~44 GiB saved) -40.3%
Output SHA-256 (no Blake3 recorded) 458b7798...9374a 458b7798...9374a 458b7798...9374a Bit-exact Bit-exact

Verification Gates

The commands of the ci.yml, nix.yml and merge-tests.yml jobs (all but cuda-compile) were run on the head, cc78388af, on a 64-core / 495 GB test box, in three parallel lanes:

Gate Result Wall Peak RSS
lake build --wfail, lake build ix, IxTests, Apps.ZKVoting.Prover, ffi-tests, kernel-check-ixe, lake -d IxC build --wfail, Ix.Cert.Audit and the kernel fence targets passed 1459s 10.8 GB
lake exe ix codegen --check & --trace-bundle --check; toolchain versions agree passed 268s 1.3 GB
lake test (primary) 60/60 passed 1359s 47.9 GB
lake lint (including the sharing-proof trust audit) passed 330s 3.1 GB
lake test -- --tier ci:cli 5/5 passed 178s 2.9 GB
ixon-v4-primitives & ixon-v4-tests --primitives passed 86s 3.0 GB
lake test -- --tier ci:compiler-closures 8/8 passed 667s 75.6 GB
lake test -- --tier ci:misc & Apps.ZKVoting.Prover 4/4 passed (kernel-tutorial 376/0) 1077s 25.8 GB
lake test -- --tier ci:landing-initstd-cli 3/3 passed (initstd-reference: 103 roles admitted, 99,514/99,519, Blake3 a24fd146...eca9a3) 322s 13.8 GB
lake run check-kernel --with-model passed (certified entry, 39/39 host-compiled cases; set-theory model audit: standard axioms only) 27s (built by the first step) 3.0 GB
ffi-tests under Valgrind (generic codegen, as CI builds it) passed (0 errors, 0 bytes definitely lost) 830s 13.1 GB
cargo fmt --check, cargo clippy -D warnings, cargo check, cargo nextest (CI's features) passed (716 passed, 9 skipped) 1095s 9.7 GB
nix flake check (ix-tests) passed (60/60) 2012s —
actionlint no findings beyond those on main 2s —

Preserve the fallback-only input recursor guard and specification version 3
role validation. Measure the combined runtime closures before refreezing:

- Public admission: 6032 to 6036; tiered admission: 6142 to 6146.
- Admission operations: 6029 to 6033; projection: 6054 to 6058.
- Authenticated operations: 6070 to 6074; tiered: 6152 to 6156.
- Artifact check and checkAt: 6068 to 6072 each.
- Artifact checkTiered and checkTieredAt: 6202 to 6206 each.
- Host admission: 6461 to 6465.

The role-shape changes add iffFamily, nonemptyFamily, sorryAxSpecTy and its
two closed terms and remove Role.spec._closed_1. The earlier 32-function
inputIndexed change remains. Extern, implemented_by, unsafe, csimp and all
ruling counts remain unchanged. Inherit regenerated role files without
manual edits.
Combine the bounded decoder, strict host admission, certified compiler path, and benchmark registry. Preserve both the execution-substitution audit and the measured standard-axiom task-equivalence guards. Register all decoder rejection-parity and node-budget boundary cases in the required primary tier.
Run the committed Lean code generator, trace bundle generator, and claim fixture exporter after integrating the corrected role specification. Preserve the catalog shape pin and unchanged IxVM generated outputs; the schema digest and aggregate claims follow the corrected role table. Regeneration and focused aggregate, ingress, and wire-format checks pass.
Preserve the binding-proof refusal controls and the trace-shard aggregate path together. Register the cross-toolchain aggregate runner beside the decoder rejection-parity suite. The generated role and aggregate artifacts come from the committed generators after the role-table correction.
Describe the committed toolchain fixtures, catalog verification and refusals, prerequisites, and separate aggregate and shard memory budgets. Include the aggregate budget setting in the existing manual runner description.
Make compileExpr the well-founded implementation and compileExprStep its constructor step. Keep the reading and wire theorem statements while removing the identity alias and duplicate proof wrappers. ReadingAudit drops only those redundant roots: two expression theorems, one wire wrapper and one runtime alias; all remaining roots and axiom checks stay enforced. Retain the index and blob refusal controls, replacing duplicate alias calls with retry and cache-hit checks. Run each semantic-contract fixture through the single implementation.
The bounded parallel map now lives in Ix.Compile.Parallel. Freeze its
complete body alongside the thin Cert.parMap wrapper, and audit the four
slice lemmas at their actual declaration names. Add map_eq as the thirteenth
schedule proof root and Parallel.map as the fifth checked safe definition;
these count increases cover the shared implementation without dropping
any of the existing scheduling proofs or runtime checks.
Update the compiler overviews to describe the certified CLI default, shared wave driver, checked parallel report helper, and reused ground split and condensation. Distinguish the optional streamed front end and remove the unsupported Rust memory comparison. This changes comments only.
Merge the pending native-definition specifications with the bounded decoder, certified execution path, strict host admission, and catalog aggregation. The new ordinary-checker equation validation and PinGen call are an unvalidated work in progress. Preserve measured hardened audit expectations until explicit measurement of the larger specification; generated roles, fixtures and pins still require regeneration. Do not publish this checkpoint.
Compile every mutual member in source order with its own consecutive index. Remove singleton-vector allocation, representative selection and maximum constructor reservations; preserve singleton grouping at the serialized metadata boundary. Exercise distinct definition indices and constructor slots across multiple members.
Exercise a late mutual name conflict against a real compiled owner and a scheduler failure after literal storage. Require the remaining serialized artifact to equal the successful subset, including its anonymous records and metadata.
Keep the serial recordStore definition and replace its runtime evaluation through an exact equality theorem. Sort records and blobs and run preflight, uniqueness, and authentication before parallel canonical decoding; replay results in original order so the complete first refusal is unchanged. Kernel admission keeps its original path.

Guard the decoder equality and store replacement at the standard three axioms. Add native controls against the literal serial implementation for chunk boundaries, late record limits, authentication precedence, conflicting caches, and malformed or noncanonical authenticated orphan records. No benchmark result is claimed.
Combine the expression compiler cleanup with proved graph, ground-check,
and canonical-record decoding replacements. Preserve checked-store indices,
certificate overlap refusals and both primary decoder suites.

The existing combined gate continues on its frozen parent source. This
integration will be checked separately before publication.
Replace singleton member classes with ordered members in the Lean compiler, context and projections. Keep singleton grouping at serialized metadata boundaries. Remove representative/equivalent folds and the vacuous class-shape hypotheses; preserve the source-order and constructor-index contracts and final certification statements.

ReadingAudit removes two obsolete wire lemmas, four redundant count/shape lemmas, four class projection lemmas, three class maximum/fold lemmas and two runtime class wrappers. Their flat-member counterparts retain the applicable obligations. The internal ClassesAgree print guard disappears with its definition; mutual_correct now has no class-specific premises. These are structural simplifications, not reduced coverage.
Move the shared primitive-address data and membership helpers into Ix and update the resource validator, claim harness and parity fixtures. The address bytes and table order are unchanged.
Stage anonymous records, blobs, names, metadata, hints and class ordering until the whole block succeeds. Recheck the complete batch under a shared publication lock before inserting any entry, and report a late conflict as the scheduler block failure. Dropping staged output never deletes identical content owned by concurrent successful blocks.

Cover both failure orders, concurrent conflicting commits, late constant/blob/name conflicts, successful publication byte equality, and production named/anonymous partial-file output. Require Rust and Lean partial artifacts to agree and preserve fail-closed destination behavior. The compiler release suite passes 259 tests; strict lint, formatting, the Lean test build and the claim/publication FFI suite pass.
Describe exact cache keys, checked report properties and current metadata behavior without private work-queue or plan-file references. Give the index-safety fixture a descriptive name. Add a baseline-free source terminology lint and scanner controls, and run it from the existing lint driver. The standalone scanner passes over 1941 source and documentation files.
Give the bind proof its expected postcondition before introducing run arguments in the flat payload shape and definition-kind inductions. The first strict core run found the shape elaboration mismatch; context and source-order proofs and Rust compiler tests passed.
Remove obsolete compiler-stage references and singleton-class terminology from the affected compiler proof comments. Retain the semantic reading, table and source-position conditions.
Relate the member projection loop to its explicit indexed step by cases on each member, and use the rewritten lookup equation after selecting a payload. Preserve the failed full proof run and strengthen no assumptions.
Describe the current Source admission, projection layout and dependency scheduler directly, without retired compiler hooks or proof-stage labels.
@johnchandlerburnham

Copy link
Copy Markdown
Member Author

!merge-tests

@johnchandlerburnham

Copy link
Copy Markdown
Member Author

!benchmark aiur fresh

@johnchandlerburnham
johnchandlerburnham enabled stacked auto-merge November 5, 2026 22:17
@github-actions

github-actions Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

!benchmark — main vs 38f0340

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

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

8 workloads · 2 with regressions · 8 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) Δ% trace-shards (main) trace-shards (PR) Δ%
ByteArray.utf8DecodeChar?_utf8EncodeChar_append 9.240 s 6.793 s -26.5% (1.36× faster) 🟢 54.083 s 49.875 s -7.8% (1.08× faster) 🟢 49.870 54.070 +8.4% (1.08× faster) 🟢 67.11 GiB 67.09 GiB -0.0% 5.43 MiB 5.44 MiB +0.2% 33.6 ms 32.5 ms -3.4% 🟢 116.27B 116.27B +0.0% 1 1 +0.0%
Array.extract_append 7.404 s 5.217 s -29.5% (1.42× faster) 🟢 42.060 s 38.295 s -9.0% (1.10× faster) 🟢 35.880 39.400 +9.8% (1.10× faster) 🟢 50.42 GiB 50.52 GiB +0.2% 5.36 MiB 5.36 MiB -0.1% 35.7 ms 32.3 ms -9.4% (1.10× faster) 🟢 85.54B 85.54B +0.0% 1 1 +0.0%
Char.ofOrdinal_le_of_le 6.453 s 5.065 s -21.5% (1.27× faster) 🟢 38.608 s 35.130 s -9.0% (1.10× faster) 🟢 69.310 76.170 +9.9% (1.10× faster) 🟢 49.81 GiB 49.77 GiB -0.1% 5.42 MiB 5.41 MiB -0.1% 32.9 ms 32.9 ms +0.2% 83.05B 83.05B +0.0% 1 1 +0.0%
Std.HashMap 4.274 s 3.521 s -17.6% (1.21× faster) 🟢 25.735 s 23.562 s -8.4% (1.09× faster) 🟢 79.230 86.540 +9.2% (1.09× faster) 🟢 34.19 GiB 34.15 GiB -0.1% 5.36 MiB 5.35 MiB -0.2% 34.2 ms 31.3 ms -8.6% (1.09× faster) 🟢 55.46B 55.46B +0.0% 1 1 +0.0%
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq 3.641 s 3.041 s -16.5% (1.20× faster) 🟢 24.086 s 22.074 s -8.4% (1.09× faster) 🟢 73.400 80.100 +9.1% (1.09× faster) 🟢 32.24 GiB 32.12 GiB -0.4% 5.31 MiB 5.32 MiB +0.1% 40.1 ms 32.0 ms -20.1% (1.25× faster) 🟢 48.32B 48.32B +0.0% 1 1 +0.0%
String.append 804.0 ms 699.6 ms -13.0% (1.15× faster) 🟢 2.451 s 2.369 s -3.3% 🟢 107.320 111.010 +3.4% 🟢 5.55 GiB 5.61 GiB +1.0% 5.09 MiB 5.08 MiB -0.2% 29.5 ms 32.5 ms +10.2% (1.10× slower) ⚠️ 2.91B 2.91B +0.0% 1 1 +0.0%
Nat.add_comm 507.3 ms 480.6 ms -5.3% (1.06× faster) 🟢 1.102 s 1.039 s -5.7% (1.06× faster) 🟢 30.860 32.730 +6.1% (1.06× faster) 🟢 4.08 GiB 3.91 GiB -4.4% 🟢 4.88 MiB 4.87 MiB -0.2% 28.7 ms 27.2 ms -5.2% (1.05× faster) 🟢 362.82M 362.82M +0.0% 1 1 +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 3.477 s 3.108 s -10.6% (1.12× faster) 🟢 37.300 s 35.252 s -5.5% (1.06× faster) 🟢 72.310 76.510 +5.8% (1.06× faster) 🟢 54.11 GiB 54.57 GiB +0.9% 2.69 MiB 2.69 MiB +0.3% 15.7 ms 15.9 ms +1.1% 102.42B 102.89B +0.5%
Array.extract_append 3.415 s 3.008 s -11.9% (1.14× faster) 🟢 37.293 s 35.190 s -5.6% (1.06× faster) 🟢 40.460 42.880 +6.0% (1.06× faster) 🟢 53.54 GiB 53.26 GiB -0.5% 2.69 MiB 2.70 MiB +0.3% 15.6 ms 15.8 ms +0.9% 101.02B 100.81B -0.2%
Char.ofOrdinal_le_of_le 3.505 s 3.152 s -10.1% (1.11× faster) 🟢 37.945 s 35.328 s -6.9% (1.07× faster) 🟢 70.520 75.750 +7.4% (1.07× faster) 🟢 54.21 GiB 54.42 GiB +0.4% 2.69 MiB 2.70 MiB +0.2% 16.0 ms 15.8 ms -1.4% 102.52B 101.82B -0.7%
Std.HashMap 3.410 s 3.065 s -10.1% (1.11× faster) 🟢 37.046 s 34.786 s -6.1% (1.06× faster) 🟢 55.040 58.610 +6.5% (1.06× faster) 🟢 52.79 GiB 52.50 GiB -0.6% 2.70 MiB 2.70 MiB -0.2% 16.0 ms 17.0 ms +6.1% (1.06× slower) ⚠️ 100.87B 99.82B -1.0%
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq 3.328 s 3.134 s -5.8% (1.06× faster) 🟢 36.229 s 34.793 s -4.0% 🟢 48.800 50.810 +4.1% 🟢 52.58 GiB 52.63 GiB +0.1% 2.70 MiB 2.70 MiB +0.1% 15.9 ms 15.8 ms -0.8% 98.88B 99.17B +0.3%
String.append 3.116 s 2.831 s -9.1% (1.10× faster) 🟢 35.924 s 32.757 s -8.8% (1.10× faster) 🟢 7.320 8.030 +9.7% (1.10× faster) 🟢 50.40 GiB 48.60 GiB -3.6% 🟢 2.70 MiB 2.70 MiB -0.0% 16.4 ms 16.1 ms -2.0% 93.30B 91.62B -1.8%
Nat.add_comm 2.912 s 2.719 s -6.6% (1.07× faster) 🟢 34.059 s 31.723 s -6.9% (1.07× faster) 🟢 1 1.070 +7.0% (1.07× faster) 🟢 47.40 GiB 46.53 GiB -1.8% 2.70 MiB 2.70 MiB -0.2% 16.6 ms 16.4 ms -1.2% 88.44B 86.15B -2.6%
Aggregate flat join (1 pair)
pair 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) Δ%
Nat.add_comm + String.append 4.111 s 3.836 s -6.7% (1.07× faster) 🟢 38.978 s 37.648 s -3.4% 🟢 56.32 GiB 56.21 GiB -0.2% 2.88 MiB 2.91 MiB +0.8% 20.6 ms 17.1 ms -16.9% (1.20× faster) 🟢 118.74B 119.33B +0.5%
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 31.4s 1m 25.1s -6.8% (1.07× faster) 🟢 29.510 31.680 +7.4% (1.07× faster) 🟢 67.11 GiB 67.09 GiB -0.0%
Array.extract_append 1m 19.4s 1m 13.5s -7.4% (1.08× faster) 🟢 19.020 20.530 +7.9% (1.08× faster) 🟢 53.54 GiB 53.26 GiB -0.5%
Char.ofOrdinal_le_of_le 1m 16.6s 1m 10.5s -8.0% (1.09× faster) 🟢 34.960 37.980 +8.6% (1.09× faster) 🟢 54.21 GiB 54.42 GiB +0.4%
Std.HashMap 1m 2.8s 58.349 s -7.1% (1.08× faster) 🟢 32.480 34.940 +7.6% (1.08× faster) 🟢 52.79 GiB 52.50 GiB -0.6%
_private.Init.Data.Range.Polymorphic.SInt.0.Int64.instRxcHasSize_eq 1m 0.3s 56.867 s -5.7% (1.06× faster) 🟢 29.310 31.090 +6.1% (1.06× faster) 🟢 52.58 GiB 52.63 GiB +0.1%
String.append 38.374 s 35.126 s -8.5% (1.09× faster) 🟢 6.850 7.490 +9.3% (1.09× faster) 🟢 50.40 GiB 48.60 GiB -3.6% 🟢
Nat.add_comm 35.161 s 32.762 s -6.8% (1.07× faster) 🟢 0.970 1.040 +7.2% (1.07× faster) 🟢 47.40 GiB 46.53 GiB -1.8%
  • Base hardware (base run @ 3c8999c (fresh — bencher bypassed)): CPU: Intel(R) Xeon(R) 6975P-C · vCPUs: 32 · RAM: 247.7 GiB
  • PR hardware: CPU: Intel(R) Xeon(R) 6975P-C · vCPUs: 32 · RAM: 247.7 GiB

Workflow logs

johnchandlerburnham added a commit that referenced this pull request Nov 6, 2026
One commit for #677's history after 05cc396; its tree equals 38f0340's.
426a242 (#675), which #677 merged from main, is kept as a parent so merges
see #675's original files as their base.
johnchandlerburnham added a commit that referenced this pull request Nov 6, 2026
#677's history after 05cc396 is squashed into fb8e986 (tree of
38f0340; #675's 426a242 kept as a parent so the compression bridge
merges against #675's original files).

- Legacy Aiur, IxVM, MultiStark and codegen files #677 changed stay
  deleted. Their semantics reach the formal programs by regeneration:
  tools/ixvm/adapt.py and recursion.py now read Ix at 38f0340
  (self-assumption and duplicate-discharge checks, user axioms in claims,
  RoleSpecGen CSE). run_check_env's pointer-identity guard against an
  empty owned tree becomes a reviewed refutable Cons pattern.
- The security fix's regressions move to the formal harnesses:
  Tests/FormalAiur.lean (Check/CheckEnv self-assumption, empty owned tree)
  and Tests/FormalAggregate.lean (duplicate and self-discharging joins,
  overlapping subjects).
- ClaimContext.ofEnv keeps #678's bindingAssumed and gains #677's user
  axiom tree; ClaimHarness takes #677's assumeBinding/user-axiom scope.
- #677's deletions win where #678 had only kept code alive: ix-bench
  (its two helpers move into the stark-verifier compare example),
  shardManifestFromPartition, dead ffi dependencies, retired suites and
  CI jobs. Tests/Main.lean starts from #677's registry minus the legacy
  suites #678 retired.
- ProveCmd: --compress is refused with --assume-binding, as #677 refuses
  aggregation.
- CI: drop ixon/sharing-profile, which no ixon version defines.
Comment thread Ix/IxVM/Kernel/Claim.lean Resolved
johnchandlerburnham added a commit that referenced this pull request Nov 6, 2026
The previous merge took #677 as a squash (fb8e986), so 38f0340 was not
an ancestor and GitHub replayed #677's commits against the resolved tree.
This merge changes no files: the tree is 20c4395's.
@arthurpaulino

Copy link
Copy Markdown
Member

!benchmark aiur-sharded-env BENCH_ENVS=ISLB

johnchandlerburnham added a commit that referenced this pull request Nov 6, 2026
#677 now rejects an empty owned tree in run_check_env by matching on the
loaded tree. Pin the adapter to 075b49e, drop its local override of the
old pointer comparison, and regenerate KernelClaim from the upstream match.
Legacy files the commit touched stay deleted.
@github-actions

github-actions Bot commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

!benchmark — main vs 075b49e

backends: aiur-sharded-env · envs: ISLB · machine: r8i.8xlarge

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

1 constant · 0 with regressions · 0 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 16.9s 1m 19.1s +2.8% 2.40K 2.33K -2.7% 183.93 GiB 183.41 GiB -0.3% 184,335 184,335 +0.0% 114 114 +0.0%
  • Base hardware (bencher @ 3c8999c): CPU: Intel(R) Xeon(R) 6975P-C · vCPUs: 32 · RAM: 247.7 GiB
  • PR hardware: CPU: Intel(R) Xeon(R) 6975P-C · vCPUs: 32 · RAM: 247.7 GiB

Workflow logs

arthurpaulino
arthurpaulino previously approved these changes Nov 6, 2026
@johnchandlerburnham
johnchandlerburnham added this pull request to the merge queue Nov 6, 2026
@johnchandlerburnham
johnchandlerburnham removed this pull request from the merge queue due to a manual request Nov 6, 2026
@johnchandlerburnham

Copy link
Copy Markdown
Member Author

!merge-tests

@arthurpaulino
arthurpaulino added this pull request to the merge queue Nov 6, 2026
Merged via the queue into main with commit 3d725c8 Nov 6, 2026
14 checks passed
@arthurpaulino
arthurpaulino deleted the jcb/ix-certified-v3-followup branch November 6, 2026 14:20
johnchandlerburnham added a commit that referenced this pull request Nov 6, 2026
Brings in a1401a6 (FFI diff test runs diffCmd in-process) and 33dd1ca
(legacy IxVM FFT cost pins). The pins live in Tests/Ix/IxVM.lean and the
ixvm runner in Tests/Main.lean, which this branch deletes with the legacy
IxVM pipeline, so both conflicts keep the deletion.
johnchandlerburnham added a commit that referenced this pull request Nov 6, 2026
3d725c8 has the same tree as #677's tip 33dd1ca, merged in the parent
commit, and its parent 3c8999c is already an ancestor. Without this
ancestry GitHub reports #678 as conflicting with main.
johnchandlerburnham added a commit that referenced this pull request Nov 6, 2026
075b49e was on #677's branch, which is now deleted, so it is reachable only
through refs/pull/677/head. 3d725c8 has the same Ix/IxVM and
Ix/Aggr/Circuit.lean sources, so the generated Aiur is unchanged.
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