Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Releases]¶
v1.6.0 - July 29, 2026¶
This update ships three sets of features: first, a new tool, extract_proof_states, for proof state analysis in bulk. Second, better support for "find-the-answer"-style problems, e.g. problems where the candidate solution must provide an explicit answer in addition to the formal proof; you can read more about such problems here. Third, various fine-tuned efficiency improvements that customize elaboration to skip unnecessary work. Most users can ignore these settings, but instructions are available on the troubleshooting page.
Added¶
- Added a new tool:
extract_proof_states, which returns the tactic proof state at the end of each line of the given Lean code, as shown in an editor's goal panel, as a list of{line, proof_state}objects. Output is capped at 10,000,000 characters; past the cap, states are omitted and thetruncatedfield is set. See theextract_proof_statespage for details. extract_declsnow accepts anelaborate_proofsoption (defaulttrue). When set tofalse, every theorem proof is replaced withsorrybefore elaboration, which is much faster on proof-heavy files. Statement-level fields (type,type_hash,signature, type dependencies, positions) are still computed, and non-theorem declarations are unaffected. Some fields are empty in this mode, and others are incomplete, so use with caution. Use this to cheaply list a file's declarations (e.g. to feed thenames/indicesparameters of other tools). See theextract_declspage for details. Regular users can safely disregard this option.- Various transformation tools (
theorem2sorry,theorem2lemma,rename,merge,have2sorry,have2lemma,sorry2lemma) now accept areparseoption (defaulttrue). These tools re-elaborate their output to report freshlean_messages; settingreparsetofalseskips that step (often the most expensive part of the request) and returns emptylean_messages. Use it when you don't need compiler feedback on the transformed output. Regular users can safely disregard this option. - Added a
remove_openspass tonormalize. It removesopencommands, includingopen ... inprefixes. Combine it withexpand_decl_namesandexpand_scoped_notationsso that names and notations no longer rely on the removedopens; a tool warning is emitted otherwise. See thenormalizepage for details.
Changed¶
verify_proofno longer elaborates the proofs of declarations listed inpermitted_sorries, which is faster but means errors or disallowed axioms inside those proofs now go unnoticed instead of failing verification. This is a change from before, when only explicit sorries are permitted but errors/disallowed axioms are still registered as failures.- When
verify_negationis set, sorrieddefs informal_statementare now universally quantified in the negated theorem types: fordef answer : T := sorryandtheorem main : P answer, the disproof must prove∀ answer : T, ¬ P answerinstead of¬ P answer. The quantifiers follow the declaration order of the sorried defs, and the disproof no longer needs to declare them. See theverify_negationparameter documentation for details and limitations. This affects "find the answer"-style problems.
Fixed¶
- Fixed proofs containing
bv_decide, which previously failed with an unintelligible message. Now supported as in vanilla Lean. - Sorried-out definitions in formal statements are no longer unfolded in
verify_proof. For example, this case used to fail because withuse_def_eq=True, theanswerwould be unfolded into different values in the formal statement and the candidate solution, causingverify_proofto reject the proof with the message "Theorem 'problem' does not match expected signature". This affects "find the answer"-style problems. - Fixed two bugs affecting the
normalizetool: - The
expand_scoped_notationsoption incorrectly failed to expand notations added to the namespace via theopen scopedcommand, and sometimes incorrectly expanded namespaced global notations. - The
expand_decl_namesoption sometimes incorrectly expanded synthetic identifiers that were attached to the same source range as an identifier.
v1.5.0 - July 15, 2026¶
This update comes with new LeanTimeout/LeanResourceExceeded exceptions, names/indices selection on check and extract_decls/extract_theorems (to skip elaboration for faster runs), and new fields and options (unfolded_type_hash, verify_negation, verbosity).
Added¶
- Added
LeanResourceExceededandLeanTimeoutexceptions. The Lean worker exceeding its memory cap or time budget now raises a distinct, non-retryable exception instead of the genericAxleRuntimeError, so callers can record it as a deterministic outcome rather than retrying. check,extract_decls, andextract_theoremsnow accept optionalnamesandindicesarguments (astheorem2sorryand similar tools already do) to select which declarations to process. The returned documents / messages are restricted to them, and elaboration is skipped for the proofs of unselected declarations. This is a speed feature and should be used when elaborating the whole file is too slow. Note that this changes the behavior of the tool: the returned Lean messages will be incomplete, and the per-documentcontentfield forextract_declsandextract_theoremsis returned empty. See thecheckandextract_declspages for more details. Regular users with no speed concerns can disregard these options.extract_declsdocuments now include anunfolded_type_hashfield: the type hash after unfolding module-local elaboration auxiliaries (e.g.foo.match_1), so types differing only by such an auto-generated name deduplicate wheretype_hashwould not. See theextract_declspage for details. The behavior of the basetype_hashfield is unchanged.verify_proofnow accepts averify_negationoption (defaultfalse). When set,verify_proofadditionally checks whethercontentproves the negation offormal_statement— i.e. whether it disproves the statement — and reports the result in a newnegationfield, which carries the sameokay,tool_messages, andfailed_declarationsas the top-level result. The field is omitted unlessverify_negationis set. Regular users can ignore this option.disproveandextract_declsnow accept averbosityparameter (0=default, 1=robust, 2=extra robust), which affects the pretty-printed types output by the tools (thenegatedfield indisprove, and the per-documenttypefield inextract_decls). Higher verbosity levels make the pretty-printer more explicit, which helps when the default output re-elaborates ambiguously. This is the same behavior as existing tools with theverbosityparameter, e.g.have2lemma,sorry2lemma.- Added
AxleClient.get_latest_environment(), which fetches the available Lean+Mathlib environments and returns the latest one. - Added instructions for citing AXLE in the documentation. See Citing AXLE.
- Added Lean 4.32.0 support.
Fixed¶
- Fixed a bug in tools that analyze term-mode goals (
have2lemma,sorry2lemma,disprove) causing goal extraction to silently fail withinclude_whole_context=false. For example, this request failed in previous versions, leaving the content unchanged. verify_proofis now module-aware. Previously, module dependencies would be treated as disallowed axioms when not using the default header. For example, this request was wrongfully rejected but now passes.
Changed¶
- Various tools now skip proof elaboration for unselected declarations when
namesorindicesis provided. This is a speed change; however, any outputs pertaining to the unselected declarations (e.g. Lean messages from their proofs) are unreliable and should not be used.
v1.4.0 - July 1, 2026¶
AXLE will be presented at the 3rd AI for Math Workshop at ICML 2026 as a contributed talk! Read the technical report on arXiv.
This update comes with two notable changes to ignore_imports and the okay/tool_messages fields, and a variety of additional features:
Changed¶
-
ignore_importsnow defaults totrue. When your code's imports don't match the environment's default header, AXLE substitutes the default header (reusing the cached environment) instead of raising an error. Settingignore_imports=falseno longer errors on a mismatch; instead AXLE processes your imports as written, which is significantly slower and may give incorrect results if a required dependency such asMathlib.Tacticis missing (a warning is returned in these cases). See Import Mismatches for details. -
Reworked the
tool_messagesandokayfields for a few tools. See Interpreting theokayfield for details.checknow reports validation findings (sorry, disallowed axioms, unsafe definitions) astool_messageswarnings instead of errors.okaycontinues to reflect compilation only, and the offending declarations remain listed infailed_declarations.repair_proofsnow reports failed repairs (e.g. terminal tactics that fail to prove asorry) astool_messageserrors instead of warnings, sookayisTrueonly when the repaired code compiles and all repairs succeed.
-
Many tools now inspect values of opaques:
opaqueandpartial def(andtheoremin 4.30+).mergenow considers opaque bodies, not just types, when de-duplicating.extract_declsnow populates value fields for opaques.
-
In
checkandverify_proof, file-level validation errors now invalidate all contained declarations — e.g. use ofopen privateresults in every declaration being added tofailed_declarations. -
Reworded one of the
verify_proof/checkerror messages to be more descriptive.- Before:
Declaration '{name}' uses 'sorry' which is not allowed in a valid proof - After:
Declaration '{name}' is incomplete (uses 'sorry' or has errors)
- Before:
Added¶
- Added Lean 4.30.0 and 4.31.0 support.
- Added a
relax_defeq_transparencyrepair pass torepair_proofs(on by default). Lean 4.29'sbackward.isDefEq.respectTransparency(defaulttrue) keepsisDefEqfrom unfolding reducible/instance definitions when unifying implicit arguments, breaking proofs that relied on it. Mathlib turns it off per-theorem. This repair prependsset_option backward.isDefEq.respectTransparency false inwhen the fix gets the proof further (all errors resolved, or the first error appears later in the source). On environments without the option, the repair is a no-op. extract_declsandextract_theoremsreport four new per-declaration fields:type_depth,term_depth,wall_ms, andheartbeats. See theextract_declspage for more details.
Removed¶
- Removed the
http2parameter from theAxleClientconstructor, which was slowing the client down. The client now uses HTTP/1.1 exclusively (viaaiohttp); the optional HTTP/2 transport and itshttpxdependency have been dropped. Code that passedhttp2=...should remove that argument.
Fixed¶
- Fixed
extract_declsbug for opaques where value dependencies were misclassified as type dependencies. - Fixed
disprovebug negating only the goal instead of negating the entire declaration type. The negated goal is now returned in a newnegatedfield (a map from theorem name to negated goal) instead of being appended to eachresultsmessage. - Browser-based clients (web apps, extensions, in-page demos) can call AXLE directly! The HTTP API now supports cross-origin (CORS) requests:
OPTIONSpreflights return204withAccess-Control-Allow-*headers, and every/api/v1/response carriesAccess-Control-Allow-Origin. - Fixed HTTP status codes on
/api/v1/endpoints: an unknown tool name now returns404(previously200with auser_errorbody), and methods other thanPOSTreturn405with anAllowheader (previously422). - Fixed a rare bug resulting in lost executor slots. This bug used to cause a rare user-side failure or, more commonly, very high latency for some requests.
Thanks to @SSingh-07 on Github for submitting a few issues, which we have fixed in this update!!
v1.3.0 - June 3, 2026¶
This update comes with support for all declaration kinds, a reworked repair_proofs, link shortening, and broader MCP support.
Added¶
- Added link shortening to the gateway. The web UI has been updated correspondingly. Try it out: https://axle.axiommath.ai/check#r=7d70453f-813f-4d19-8de9-44793dafa835
- Added Claude web, desktop, and mobile support to the
axiom-axle-mcpMCP server via a hosted endpoint athttps://mcp.axiommath.ai/mcp. See the Quick Start for details. Thanks to Andrew Sutherland for suggestions on setting up this hosted instance. - Added three new fields to the
infofield of every response to identify the executor version your request was handled on:_executor_commit_sha,_executor_docker_image_id, and_executor_artifact_sha256.
Changed¶
-
Added a new option
theorems_only(defaulttrue) to all tools that select over theorems/lemmas. These tools now have the ability to select over all declaration kinds:theorem2lemma,theorem2sorry,simplify_theorems,repair_proofs,have2lemma,have2sorry,sorry2lemma,disprove:- To use this feature, set
theorems_onlytofalse. For backwards compatibility (default), keeptheorems_onlyset totrue. - You can now sorry out any declaration body, simplify/repair any declaration containing a proof, and extract lemmas from any
sorrylocations and anyhavestatement locations in any declarations, including definitions, opaques, instances, etc. - For
theorem2lemmaanddisprove, the new setting is a no-op on non-theorem kinds. - Note that the value of
theorems_onlyaffects what thenamesandindicesfields select over. Whentheorems_onlyisfalse, names and indices refer to all declarations, not just theorem kinds.
- To use this feature, set
-
Reworked
repair_proofs(the first of several planned changes):- Added two new passes to
repair_proofs:remove_unknown_options, which strips unknown options both at the command-level and within proofs/terms, andenable_autoImplicit, which restores theautoImplicitoption at the beginning of a theorem if an unknown identifier error occurs in a theorem's type signature. - Added command-level re-elaboration to
repair_proofs, allowing repairs to stack (for example, when applying terminal tactics reveals another error to fix). replace_unsafe_tacticsnow warns the user when replacingnative_decidewithdecide +kernelfails. The tactic location is now left untouched.apply_terminal_tacticsnow warns when no terminal tactics could be successfully applied at a given location inrepair_proofs.- Fixed a bug in
apply_terminal_tacticsallowing malformed proofs with metavariables to be counted as successes inrepair_proofs.
- Added two new passes to
-
verify_proofnow permitspartial defandopaque. These checks were overly strict previously and do not raise soundness concerns. mergenow deduplicates other declaration kinds: axioms, opaques, inductives, classes, structures, etc. Previously, only theorems and definitions were eligible for deduplication.extract_declsnow names anonymous declarations (examples, anonymous instances) by their start position, line then column (e.g._example_12_0), rather than a running counter (e.g._example_0), so the placeholder is stable and remains unique across a file even when several share a line.- Added the
merge_duplicates(defaultfalse) option tosorry2lemma, which merges extracted lemmas that are duplicates (either with other lemmas, or to the existing top-level theorem/lemma from which they are extracted) by definitional equality into a single lemma with all callsites pointing at it. Existing behavior can be retained with the default settingmerge_duplicates=false.
Fixed¶
- Added faster, more graceful retries on certain classes of connection errors. Minor change.
v1.2.1 - April 29, 2026¶
This is a minor update deprecating extract_theorems, switching to HTTP/2, and adding an extra pass to normalize.
Deprecated¶
extract_theoremshas been deprecated and will no longer be updated. Please useextract_declsinstead, which supports all declaration kinds (def, theorem, lemma, abbrev, instance, structure, etc.).
Changed¶
- The AXLE client now uses HTTP/2 by default. We don't expect any significant performance differences from this change, but feel free to file a bug report if this is not the case. Users may set the
http2parameter to false in the client constructor to revert back to the original HTTP/1.1 settings.
Added¶
- Added a new option
expand_scoped_notationsto thenormalizetool, which delaborates scoped notations into their expanded forms. See thenormalizedocumentation page for details.
Fixed¶
- Fixed a bug in the executors causing requests to hang, occasionally resulting in abnormally high latencies.
v1.2.0 - April 15, 2026¶
New extract_decls tool for extracting all declaration kinds, and corresponding updates to extract_theorems. Users using extract_theorems (which will be deprecated in a future update) should migrate to extract_decls.
Added¶
- Added two new fields in
extract_theoremsto be consistent withextract_decls(see below):kind: alwaystheoremforextract_theorems.declaration_messages: same content astheorem_messages.theorem_messagesis now deprecated and will be removed in a future update.
- Added
extract_decls, an upgraded version ofextract_theoremsthat extracts all declaration kinds.- New
kindfield in each document. Possible values:theorem,def,abbrev,axiom,opaque,structure,class,class inductive,inductive,instance,example,unknown - Note: Not all fields are meaningful for all declaration kinds (e.g.,
proof_length/tactic_countsonly apply to theorems/lemmas with tactic proofs.) - This tool should be used instead of
extract_theoremsas it is a strict superset of functionality.extract_theoremswill be deprecated in a future update.
- New
Fixed¶
- Added "Last Used" and "Requests (24h)" columns to the API key console page for better visibility into API key usage.
v1.1.1 - April 8, 2026¶
This is a minor update coming with default option changes, a Lean version bump, and bug fixes.
Changed¶
- [!] We are turning on the
autoImplicitand turning off thepp.unicode.funLean options. AXLE will now automatically insert implicit variables when they are missing. This is a significant behavioral change, check your code! These settings are consistent with Lean's default. The previous options were remnants from internal use preferences. - [!] We have renamed
mathlib_lintertomathlib_options, which now setslinter.mathlibStandardSetto true,autoImplicitto false,relaxedAutoImplicitto false, andpp.unicode.funto true. Use this toggle to enable the stricter defaults that Mathlib uses by convention.
Added¶
- Added Lean 4.29.0 support.
- Added support for glob patterns in the
permitted_sorriesfield forverify_proof. See theverify_proofdocumentation page under thepermitted_sorriesfield for example use cases.
Fixed¶
- Fixed a bug causing timeouts to be capped at 10 minutes. All requests now max out at 15 minutes (with documentation updated correspondingly).
v1.1.0 - April 1, 2026¶
🎉 After mass feedback from the public, we're excited to announce that AXLE is switching from Lean to Rocq. The new name will be AXRE (Axiom Rocq Engine). All existing Lean proofs will be automatically translated using GPT-2. 🚀
Changed¶
- [!] Removed
document_messagesfrom the response ofextract_theorems— to replicate old behavior, run thecontentfield of the resulting documents through thechecktool. This change significantly improves the speed ofextract_theorems. - [!]
includeEndPoshas been turned on for Lean messages. This changes the format from:-:4:38: error: Function expected at...to (when endPos is available):-:4:38-4:43: error: Function expected at...This change affects all tools with Lean messages. - Significantly reworked the Lean executor pool backend.
- Latency has been decreased by 50% in most cases. For longer requests, the new executors can be more than 5 times faster!
- Previously, the first request to each environment required a ~10s warmup. This is no longer the case, and so requests will be more faithful to their Lean timeout limits (not including queueing / waiting for available slots).
- Eliminates a security risk involving persistent Lean workers.
- Improved the Lean worker warm-up pipeline. Worker scale-up is also more aggressive than before. In the worst case, when all workers are completely occupied / offline, users should expect no more than a 2-3 minute delay before more worker capacity spins up.
Fixed¶
- Removed redundant parsing resulting in occasional speedups in
repair_proofs,normalize, etc. when content does not change. - Pruned missing executors from the gateway registry. Fixes a bug with autoscaling improperly triggering.
v1.0.2 - March 18, 2026¶
This is a minor patch improving some return values / error messages and shipping efficiency speedups.
Added¶
- Added explicit
okayreturn value torepair_proofs.
Changed¶
- Improved error messages for unknown options in
simplify_theorems,repair_proofs,normalize - Improved error messages for
ignore_importserror (with links to relevant docs) - Improved the efficiency of
merge, bringing down the time spent on large requests by 20-30%.
v1.0.1 - March 11, 2026¶
This is a minor patch with new documentation pages, increased rate limits, and bug fixes.
Added¶
- Added Changelog and Troubleshooting to the documentation pages.
Fixed¶
- Increased request limits and fixed a typo in the documentation. Users with an API key are now limited to 20 active requests, and anonymous users are limited to 10 active requests.
- Increased maximum timeout to 15 minutes (from 5 minutes).
- Environments are now sorted by prefix (alphabetically) and then by version number (more recent versions first)
- Fixed a bug with
disprovefailing to recognize implicit local variables. This bug was found by Bulhwi Cha on Lean Zulip.
v1.0.0 - March 4, 2026¶
We're excited to release AXLE to the public! AXLE provides proof verification and manipulation primitives we've used across all of our research efforts, including training AI models and AxiomProver's 12/12 on Putnam 2025.
Playground | API docs | Why we built AXLE | Request more capacity | axle@axiommath.ai
Join the discussion, ask questions, and share feedback on the Lean Zulip.
Added¶
- Initial release of AXLE Python client
- Async client (
AxleClient) with all 14 API tools:verify_proof- Verify proofs against formal statementscheck- Check Lean code for errorsextract_theorems- Extract theorems with dependenciesrename- Rename declarationstheorem2lemma- Convert theorem/lemma keywordstheorem2sorry- Replace proofs with sorrymerge- Combine multiple Lean filessimplify_theorems- Simplify proofsrepair_proofs- Repair broken proofshave2lemma- Extract have statements to lemmashave2sorry- Replace have statements with sorrysorry2lemma- Extract sorries and errors to lemmasdisprove- Attempt to disprove theoremsnormalize- Standardize formatting
- CLI tool with commands for all tools
- Helper functions for string manipulation
- Configuration via environment variables
- Type hints and PEP 561 compliance
- Comprehensive documentation