v4.16.0 ---------- ## Highlights ### Unique `sorry`s [#5757](https://github.com/leanprover/lean4/pull/5757) makes it harder to create "fake" theorems about definitions that are stubbed-out with `sorry` by ensuring that each `sorry` is not definitionally equal to any other. For example, this now fails: ```lean example : (sorry : Nat) = sorry := rfl -- fails ``` However, this still succeeds, since the `sorry` is a single indeterminate `Nat`: ```lean def f (n : Nat) : Nat := sorry example : f 0 = f 1 := rfl -- succeeds ``` One can be more careful by putting parameters to the right of the colon: ```lean def f : (n : Nat) → Nat := sorry example : f 0 = f 1 := rfl -- fails ``` Most sources of synthetic sorries (recall: a sorry that originates from the elaborator) are now unique, except for elaboration errors, since making these unique tends to cause a confusing cascade of errors. In general, however, such sorries are labeled. This enables "go to definition" on `sorry` in the Infoview, which brings you to its origin. The option `set_option pp.sorrySource true` causes the pretty printer to show source position information on sorries. ### Separators in numeric literals [#6204](https://github.com/leanprover/lean4/pull/6204) lets `_` be used in numeric literals as a separator. For example, `1_000_000`, `0xff_ff` or `0b_10_11_01_00`. New lexical syntax: ```text numeral10 : [0-9]+ ("_"+ [0-9]+)* numeral2 : "0" [bB] ("_"* [0-1]+)+ numeral8 : "0" [oO] ("_"* [0-7]+)+ numeral16 : "0" [xX] ("_"* hex_char+)+ float : numeral10 "." numeral10? [eE[+-]numeral10] ``` ### Additional new featues * [#6300](https://github.com/leanprover/lean4/pull/6300) adds the `debug.proofAsSorry` option. When enabled, the proofs of theorems are ignored and replaced with `sorry`. * [#6362](https://github.com/leanprover/lean4/pull/6362) adds the `--error=kind` option (shorthand: `-Ekind`) to the `lean` CLI. When set, messages of `kind` (e.g., `linter.unusedVariables`) will be reported as errors. This setting does nothing in interactive contexts (e.g., the server). * [#6366](https://github.com/leanprover/lean4/pull/6366) adds support for `Float32` and fixes a bug in the runtime. ### Library updates The Lean 4 library saw many changes that improve arithmetic reasoning, enhance data structure APIs, and refine library organization. Key changes include better support for bitwise operations, shifts, and conversions, expanded lemmas for `Array`, `Vector`, and `List`, and improved ordering definitions. Some modules have been reorganized for clarity, and internal refinements ensure greater consistency and correctness. ### Breaking changes [#6330](https://github.com/leanprover/lean4/pull/6330) removes unnecessary parameters from the functional induction principles. This is a breaking change; broken code can typically be adjusted simply by passing fewer parameters. _This highlights section was contributed by Violetta Sim._ For this release, 201 changes landed. In addition to the 74 feature additions and 44 fixes listed below there were 7 refactoring changes, 5 documentation improvements and 62 chores. ## Language * [#3696](https://github.com/leanprover/lean4/pull/3696) makes all message constructors handle pretty printer errors. * [#4460](https://github.com/leanprover/lean4/pull/4460) runs all linters for a single command (together) on a separate thread from further elaboration, making a first step towards parallelizing the elaborator. * [#5757](https://github.com/leanprover/lean4/pull/5757), see the highlights section above for details. * [#6123](https://github.com/leanprover/lean4/pull/6123) ensures that the configuration in `Simp.Config` is used when reducing terms and checking definitional equality in `simp`. * [#6204](https://github.com/leanprover/lean4/pull/6204), see the highlights section above for details. * [#6270](https://github.com/leanprover/lean4/pull/6270) fixes a bug that could cause the `injectivity` tactic to fail in reducible mode, which could cause unfolding lemma generation to fail (used by tactics such as `unfold`). In particular, `Lean.Meta.isConstructorApp'?` was not aware that `n + 1` is equivalent to `Nat.succ n`. * [#6273](https://github.com/leanprover/lean4/pull/6273) modifies the "foo has been deprecated: use betterFoo instead" warning so that foo and betterFoo are hoverable. * [#6278](https://github.com/leanprover/lean4/pull/6278) enables simp configuration options to be passed to `norm_cast`. * [#6286](https://github.com/leanprover/lean4/pull/6286) ensure `bv_decide` uses definitional equality in its reflection procedure as much as possible. Previously it would build up explicit congruence proofs for the kernel to check. This reduces the size of proof terms passed to kernel speeds up checking of large reflection proofs. * [#6288](https://github.com/leanprover/lean4/pull/6288) uses Lean.RArray in bv_decide's reflection proofs. Giving speedups on problems with lots of variables. * [#6295](https://github.com/leanprover/lean4/pull/6295) sets up simprocs for all the remaining operations defined in `Init.Data.Fin.Basic` * [#6300](https://github.com/leanprover/lean4/pull/6300), see the highlights section above for details. * [#6330](https://github.com/leanprover/lean4/pull/6330), see the highlights section above for details. * [#6362](https://github.com/leanprover/lean4/pull/6362), see the highlights section above for details. * [#6366](https://github.com/leanprover/lean4/pull/6366), see the highlights section above for details. * [#6375](https://github.com/leanprover/lean4/pull/6375) fixes a bug in the simplifier. It was producing terms with loose bound variables when eliminating unused `let_fun` expressions. * [#6378](https://github.com/leanprover/lean4/pull/6378) adds an explanation to the error message when `cases` and `induction` are applied to a term whose type is not an inductive type. For `Prop`, these tactics now suggest the `by_cases` tactic. Example: ``` tactic 'cases' failed, major premise type is not an inductive type Prop ``` * [#6381](https://github.com/leanprover/lean4/pull/6381) fixes a bug in `withTrackingZetaDelta` and `withTrackingZetaDeltaSet`. The `MetaM` caches need to be reset. See new test. * [#6385](https://github.com/leanprover/lean4/pull/6385) fixes a bug in `simp_all?` that caused some local declarations to be omitted from the `Try this:` suggestions. * [#6386](https://github.com/leanprover/lean4/pull/6386) ensures that `revertAll` clears auxiliary declarations when invoked directly by users. * [#6387](https://github.com/leanprover/lean4/pull/6387) fixes a type error in the proof generated by the `contradiction` tactic. * [#6397](https://github.com/leanprover/lean4/pull/6397) ensures that `simp` and `dsimp` do not unfold definitions that are not intended to be unfolded by the user. See issue #5755 for an example affected by this issue. * [#6398](https://github.com/leanprover/lean4/pull/6398) ensures `Meta.check` check projections. * [#6412](https://github.com/leanprover/lean4/pull/6412) adds reserved names for congruence theorems used in the simplifier and `grind` tactics. The idea is prevent the same congruence theorems to be generated over and over again. * [#6413](https://github.com/leanprover/lean4/pull/6413) introduces the following features to the WIP `grind` tactic: - `Expr` internalization. - Congruence theorem cache. - Procedure for adding new facts - New tracing options - New preprocessing steps: fold projections and eliminate dangling `Expr.mdata` * [#6414](https://github.com/leanprover/lean4/pull/6414) fixes a bug in `Lean.Meta.Closure` that would introduce under-applied delayed assignment metavariables, which would keep them from ever getting instantiated. This bug affected `match` elaboration when the expected type contained postponed elaboration problems, for example tactic blocks. * [#6419](https://github.com/leanprover/lean4/pull/6419) fixes multiple bugs in the WIP `grind` tactic. It also adds support for printing the `grind` internal state. * [#6428](https://github.com/leanprover/lean4/pull/6428) adds a new preprocessing step to the `grind` tactic: universe-level normalization. The goal is to avoid missing equalities in the congruence closure module. * [#6430](https://github.com/leanprover/lean4/pull/6430) adds the predicate `Expr.fvarsSet a b`, which returns `true` if and only if the free variables in `a` are a subset of the free variables in `b`. * [#6433](https://github.com/leanprover/lean4/pull/6433) adds a custom type and instance canonicalizer for the (WIP) `grind` tactic. The `grind` tactic uses congruence closure but disregards types, type formers, instances, and proofs. Proofs are ignored due to proof irrelevance. Types, type formers, and instances are considered supporting elements and are not factored into congruence detection. Instead, `grind` only checks whether elements are structurally equal, which, in the context of the `grind` tactic, is equivalent to pointer equality. See new tests for examples where the canonicalizer is important. * [#6435](https://github.com/leanprover/lean4/pull/6435) implements the congruence table for the (WIP) `grind` tactic. It also fixes several bugs, and adds a new preprocessing step. * [#6437](https://github.com/leanprover/lean4/pull/6437) adds support for detecting congruent terms in the (WIP) `grind` tactic. It also introduces the `grind.debug` option, which, when set to `true`, checks many invariants after each equivalence class is merged. This option is intended solely for debugging purposes. * [#6438](https://github.com/leanprover/lean4/pull/6438) ensures `norm_cast` doesn't fail to act in the presence of `no_index` annotations * [#6441](https://github.com/leanprover/lean4/pull/6441) adds basic truth value propagation rules to the (WIP) `grind` tactic. * [#6442](https://github.com/leanprover/lean4/pull/6442) fixes the `checkParents` sanity check in `grind`. * [#6443](https://github.com/leanprover/lean4/pull/6443) adds support for propagating the truth value of equalities in the (WIP) `grind` tactic. * [#6447](https://github.com/leanprover/lean4/pull/6447) refactors `grind` and adds support for invoking the simplifier using the `GrindM` monad. * [#6448](https://github.com/leanprover/lean4/pull/6448) declares the command `builtin_grind_propagator` for registering equation propagator for `grind`. It also declares the auxiliary the attribute. * [#6449](https://github.com/leanprover/lean4/pull/6449) completes the implementation of the command `builtin_grind_propagator`. * [#6452](https://github.com/leanprover/lean4/pull/6452) adds support for generating (small) proofs for any two expressions that belong to the same equivalence class in the `grind` tactic state. * [#6453](https://github.com/leanprover/lean4/pull/6453) improves bv_decide's performance in the presence of large literals. * [#6455](https://github.com/leanprover/lean4/pull/6455) fixes a bug in the equality proof generator in the (WIP) `grind` tactic. * [#6456](https://github.com/leanprover/lean4/pull/6456) fixes another bug in the equality proof generator in the (WIP) `grind` tactic. * [#6457](https://github.com/leanprover/lean4/pull/6457) adds support for generating congruence proofs for congruences detected by the `grind` tactic. * [#6458](https://github.com/leanprover/lean4/pull/6458) adds support for compact congruence proofs in the (WIP) `grind` tactic. The `mkCongrProof` function now verifies whether the congruence proof can be constructed using only `congr`, `congrFun`, and `congrArg`, avoiding the need to generate the more complex `hcongr` auxiliary theorems. * [#6459](https://github.com/leanprover/lean4/pull/6459) adds the (WIP) `grind` tactic. It currently generates a warning message to make it clear that the tactic is not ready for production. * [#6461](https://github.com/leanprover/lean4/pull/6461) adds a new propagation rule for negation to the (WIP) `grind` tactic. * [#6463](https://github.com/leanprover/lean4/pull/6463) adds support for constructors to the (WIP) `grind` tactic. When merging equivalence classes, `grind` checks for equalities between constructors. If they are distinct, it closes the goal; if they are the same, it applies injectivity. * [#6464](https://github.com/leanprover/lean4/pull/6464) completes support for literal values in the (WIP) `grind` tactic. `grind` now closes the goal whenever it merges two equivalence classes with distinct literal values. * [#6465](https://github.com/leanprover/lean4/pull/6465) adds support for projection functions to the (WIP) `grind` tactic. * [#6466](https://github.com/leanprover/lean4/pull/6466) completes the implementation of `addCongrTable` in the (WIP) `grind` tactic. It also adds a new test to demonstrate why the extra check is needed. It also updates the field `cgRoot` (congruence root). * [#6468](https://github.com/leanprover/lean4/pull/6468) fixes issue #6467 * [#6469](https://github.com/leanprover/lean4/pull/6469) adds support code for implementing e-match in the (WIP) `grind` tactic. * [#6470](https://github.com/leanprover/lean4/pull/6470) introduces a command for specifying patterns used in the heuristic instantiation of global theorems in the `grind` tactic. Note that this PR only adds the parser. * [#6472](https://github.com/leanprover/lean4/pull/6472) implements the command `grind_pattern`. The new command allows users to associate patterns with theorems. These patterns are used for performing heuristic instantiation with e-matching. In the future, we will add the attributes `@[grind_eq]`, `@[grind_fwd]`, and `@[grind_bwd]` to compute the patterns automatically for theorems. * [#6473](https://github.com/leanprover/lean4/pull/6473) adds a deriving handler for the `ToExpr` class. It can handle mutual and nested inductive types, however it falls back to creating `partial` instances in such cases. This is upstreamed from the Mathlib deriving handler written by @kmill, but has fixes to handle autoimplicit universe level variables. * [#6474](https://github.com/leanprover/lean4/pull/6474) adds pattern validation to the `grind_pattern` command. The new `checkCoverage` function will also be used to implement the attributes `@[grind_eq]`, `@[grind_fwd]`, and `@[grind_bwd]`. * [#6475](https://github.com/leanprover/lean4/pull/6475) adds support for activating relevant theorems for the (WIP) `grind` tactic. We say a theorem is relevant to a `grind` goal if the symbols occurring in its patterns also occur in the goal. * [#6478](https://github.com/leanprover/lean4/pull/6478) internalize nested ground patterns when activating ematch theorems in the (WIP) `grind` tactic. * [#6481](https://github.com/leanprover/lean4/pull/6481) implements E-matching for the (WIP) `grind` tactic. We still need to finalize and internalize the new instances. * [#6484](https://github.com/leanprover/lean4/pull/6484) addresses a few error messages where diffs weren't being exposed. * [#6485](https://github.com/leanprover/lean4/pull/6485) implements `Grind.EMatch.instantiateTheorem` in the (WIP) `grind` tactic. * [#6487](https://github.com/leanprover/lean4/pull/6487) adds source position information for `structure` parent projections, supporting "go to definition". Closes #3063. * [#6488](https://github.com/leanprover/lean4/pull/6488) fixes and refactors the E-matching module for the (WIP) `grind` tactic. * [#6490](https://github.com/leanprover/lean4/pull/6490) adds basic configuration options for the `grind` tactic. * [#6492](https://github.com/leanprover/lean4/pull/6492) fixes a bug in the theorem instantiation procedure in the (WIP) `grind` tactic. * [#6497](https://github.com/leanprover/lean4/pull/6497) fixes another theorem instantiation bug in the `grind` tactic. It also moves new instances to be processed to `Goal`. * [#6498](https://github.com/leanprover/lean4/pull/6498) adds support in the `grind` tactic for propagating dependent forall terms `forall (h : p), q[h]` where `p` is a proposition. * [#6499](https://github.com/leanprover/lean4/pull/6499) fixes the proof canonicalizer for `grind`. * [#6500](https://github.com/leanprover/lean4/pull/6500) fixes a bug in the `markNestedProofs` used in `grind`. See new test. * [#6502](https://github.com/leanprover/lean4/pull/6502) fixes a bug in the proof assembly procedure utilized by the `grind` tactic. * [#6503](https://github.com/leanprover/lean4/pull/6503) adds a simple strategy to the (WIP) `grind` tactic. It just keeps internalizing new theorem instances found by E-matching. * [#6506](https://github.com/leanprover/lean4/pull/6506) adds the `monotonicity` tactic, intended to be used inside the `partial_fixpoint` feature. * [#6508](https://github.com/leanprover/lean4/pull/6508) fixes a bug in the sanity checkers for the `grind` tactic. See the new test for an example of a case where it was panicking. * [#6509](https://github.com/leanprover/lean4/pull/6509) fixes a bug in the congruence closure data structure used in the `grind` tactic. The new test includes an example that previously caused a panic. A similar panic was also occurring in the test `grind_nested_proofs.lean`. * [#6510](https://github.com/leanprover/lean4/pull/6510) adds a custom congruence rule for equality in `grind`. The new rule takes into account that `Eq` is a symmetric relation. In the future, we will add support for arbitrary symmetric relations. The current rule is important for propagating disequalities effectively in `grind`. * [#6512](https://github.com/leanprover/lean4/pull/6512) introduces support for user-defined fallback code in the `grind` tactic. The fallback code can be utilized to inspect the state of failing `grind` subgoals and/or invoke user-defined automation. Users can now write `grind on_failure `, where `` should have the type `GoalM Unit`. See the modified tests in this PR for examples. * [#6513](https://github.com/leanprover/lean4/pull/6513) adds support for (dependent) if-then-else terms (i.e., `ite` and `dite` applications) in the `grind` tactic. * [#6514](https://github.com/leanprover/lean4/pull/6514) enhances the assertion of new facts in `grind` by avoiding the creation of unnecessary metavariables. ## Library * [#6182](https://github.com/leanprover/lean4/pull/6182) adds `BitVec.[toInt|toFin]_concat` and moves a couple of theorems into the concat section, as `BitVec.msb_concat` is needed for the `toInt_concat` proof. * [#6188](https://github.com/leanprover/lean4/pull/6188) completes the `toNat` theorems for the bitwise operations (`and`, `or`, `xor`, `shiftLeft`, `shiftRight`) of the UInt types and adds `toBitVec` theorems as well. It also renames `and_toNat` to `toNat_and` to fit with the current naming convention. * [#6238](https://github.com/leanprover/lean4/pull/6238) adds theorems characterizing the value of the unsigned shift right of a bitvector in terms of its 2s complement interpretation as an integer. Unsigned shift right by at least one bit makes the value of the bitvector less than or equal to `2^(w-1)`, makes the interpretation of the bitvector `Int` and `Nat` agree. In the case when `n = 0`, then the shift right value equals the integer interpretation. * [#6244](https://github.com/leanprover/lean4/pull/6244) changes the implementation of `HashMap.toList`, so the ordering agrees with `HashMap.toArray`. * [#6272](https://github.com/leanprover/lean4/pull/6272) introduces the basic theory of permutations of `Array`s and proves `Array.swap_perm`. * [#6282](https://github.com/leanprover/lean4/pull/6282) moves `IO.Channel` and `IO.Mutex` from `Init` to `Std.Sync` and renames them to `Std.Channel` and `Std.Mutex`. * [#6294](https://github.com/leanprover/lean4/pull/6294) upstreams `List.length_flatMap`, `countP_flatMap` and `count_flatMap` from Mathlib. These were not possible to state before we upstreamed `List.sum`. * [#6315](https://github.com/leanprover/lean4/pull/6315) adds `protected` to `Fin.cast` and `BitVec.cast`, to avoid confusion with `_root_.cast`. These should mostly be used via dot-notation in any case. * [#6316](https://github.com/leanprover/lean4/pull/6316) adds lemmas simplifying `for` loops over `Option` into `Option.pelim`, giving parity with lemmas simplifying `for` loops of `List` into `List.fold`. * [#6317](https://github.com/leanprover/lean4/pull/6317) completes the basic API for BitVec.ofBool. * [#6318](https://github.com/leanprover/lean4/pull/6318) generalizes the universe level for `Array.find?`, by giving it a separate implementation from `Array.findM?`. * [#6324](https://github.com/leanprover/lean4/pull/6324) adds `GetElem` lemmas for the basic `Vector` operations. * [#6333](https://github.com/leanprover/lean4/pull/6333) generalizes the panic functions to a type of `Sort u` rather than `Type u`. This better supports universe polymorphic types and avoids confusing errors. * [#6334](https://github.com/leanprover/lean4/pull/6334) adds `Nat` theorems for distributing `>>>` over bitwise operations, paralleling those of `BitVec`. * [#6338](https://github.com/leanprover/lean4/pull/6338) adds `BitVec.[toFin|getMsbD]_setWidth` and `[getMsb|msb]_signExtend` as well as `ofInt_toInt`. * [#6341](https://github.com/leanprover/lean4/pull/6341) generalizes `DecidableRel` to allow a heterogeneous relation. * [#6353](https://github.com/leanprover/lean4/pull/6353) reproduces the API around `List.any/all` for `Array.any/all`. * [#6364](https://github.com/leanprover/lean4/pull/6364) makes fixes suggested by the Batteries environment linters, particularly `simpNF`, and `unusedHavesSuffices`. * [#6365](https://github.com/leanprover/lean4/pull/6365) expands the `Array.set` and `Array.setIfInBounds` lemmas to match existing lemmas for `List.set`. * [#6367](https://github.com/leanprover/lean4/pull/6367) brings Vector lemmas about membership and indexing to parity with List and Array. * [#6369](https://github.com/leanprover/lean4/pull/6369) adds lemmas about `Vector.set`, `anyM`, `any`, `allM`, and `all`. * [#6376](https://github.com/leanprover/lean4/pull/6376) adds theorems about `==` on `Vector`, reproducing those already on `List` and `Array`. * [#6379](https://github.com/leanprover/lean4/pull/6379) replaces the inductive predicate `List.lt` with an upstreamed version of `List.Lex` from Mathlib. (Previously `Lex.lt` was defined in terms of `<`; now it is generalized to take an arbitrary relation.) This subtly changes the notion of ordering on `List α`. `List.lt` was a weaker relation: in particular if `l₁ < l₂`, then `a :: l₁ < b :: l₂` may hold according to `List.lt` even if `a` and `b` are merely incomparable (either neither `a < b` nor `b < a`), whereas according to `List.Lex` this would require `a = b`. When `<` is total, in the sense that `¬ · < ·` is antisymmetric, then the two relations coincide. Mathlib was already overriding the order instances for `List α`, so this change should not be noticed by anyone already using Mathlib. We simultaneously add the boolean valued `List.lex` function, parameterised by a `BEq` typeclass and an arbitrary `lt` function. This will support the flexibility previously provided for `List.lt`, via a `==` function which is weaker than strict equality. * [#6390](https://github.com/leanprover/lean4/pull/6390) redefines `Range.forIn'` and `Range.forM`, in preparation for writing lemmas about them. * [#6391](https://github.com/leanprover/lean4/pull/6391) requires that the step size in `Std.Range` is positive, to avoid ill-specified behaviour. * [#6396](https://github.com/leanprover/lean4/pull/6396) adds lemmas reducing for loops over `Std.Range` to for loops over `List.range'`. * [#6399](https://github.com/leanprover/lean4/pull/6399) adds basic lemmas about lexicographic order on Array and Vector, achieving parity with List. * [#6423](https://github.com/leanprover/lean4/pull/6423) adds missing lemmas about lexicographic order on List/Array/Vector. * [#6477](https://github.com/leanprover/lean4/pull/6477) adds the necessary domain theory that backs the `partial_fixpoint` feature. ## Compiler * [#6311](https://github.com/leanprover/lean4/pull/6311) adds support for `HEq` to the new code generator. * [#6348](https://github.com/leanprover/lean4/pull/6348) adds support for `Float32` to the Lean runtime. * [#6350](https://github.com/leanprover/lean4/pull/6350) adds missing features and fixes bugs in the `Float32` support * [#6383](https://github.com/leanprover/lean4/pull/6383) ensures the new code generator produces code for `opaque` definitions that are not tagged as `@[extern]`. Remark: This is the behavior of the old code generator. * [#6405](https://github.com/leanprover/lean4/pull/6405) adds support for erasure of `Decidable.decide` to the new code generator. It also adds a new `Probe.runOnDeclsNamed` function, which is helpful for writing targeted single-file tests of compiler internals. * [#6415](https://github.com/leanprover/lean4/pull/6415) fixes a bug in the `sharecommon` module, which was returning incorrect results for objects that had already been processed by `sharecommon`. See the new test for an example that triggered the bug. * [#6429](https://github.com/leanprover/lean4/pull/6429) adds support for extern LCNF decls, which is required for parity with the existing code generator. * [#6535](https://github.com/leanprover/lean4/pull/6535) avoids a linker warning on Windows. * [#6547](https://github.com/leanprover/lean4/pull/6547) should prevent Lake from accidentally picking up other linkers installed on the machine. * [#6574](https://github.com/leanprover/lean4/pull/6574) actually prevents Lake from accidentally picking up other toolchains installed on the machine. ## Pretty Printing * [#5689](https://github.com/leanprover/lean4/pull/5689) adjusts the way the pretty printer unresolves names. It used to make use of all `export`s when pretty printing, but now it only uses `export`s that put names into parent namespaces (heuristic: these are "API exports" that are intended by the library author), rather than "horizontal exports" that put the names into an unrelated namespace, which the dot notation feature in #6189 now incentivizes. * [#5757](https://github.com/leanprover/lean4/pull/5757), aside from introducing labeled sorries, fixes the bug that the metadata attached to the pretty-printed representation of arguments with a borrow annotation (for example, the second argument of `String.append`), is inconsistent with the metadata attached to the regular arguments. ## Documentation * [#6450](https://github.com/leanprover/lean4/pull/6450) adds a docstring to the `@[app_delab]` attribute. ## Server * [#6279](https://github.com/leanprover/lean4/pull/6279) fixes a bug in structure instance field completion that caused it to not function correctly for bracketed structure instances written in Mathlib style. * [#6408](https://github.com/leanprover/lean4/pull/6408) fixes a regression where goals that don't exist were being displayed. The regression was triggered by #5835 and originally caused by #4926. ## Lake * [#6176](https://github.com/leanprover/lean4/pull/6176) changes Lake's build process to no longer use `leanc` for compiling C files or linking shared libraries and executables. Instead, it directly invokes the bundled compiler (or the native compiler if none) using the necessary flags. * [#6289](https://github.com/leanprover/lean4/pull/6289) adapts Lake modules to use `prelude` and includes them in the `check-prelude` CI. * [#6291](https://github.com/leanprover/lean4/pull/6291) ensures the the log error position is properly preserved when prepending stray log entries to the job log. It also adds comparison support for `Log.Pos`. * [#6388](https://github.com/leanprover/lean4/pull/6388) merges `BuildJob` and `Job`, deprecating the former. `Job` now contains a trace as part of its state which can be interacted with monadically. also simplifies the implementation of `OpaqueJob`. * [#6411](https://github.com/leanprover/lean4/pull/6411) adds the ability to override package entries in a Lake manifest via a separate JSON file. This file can be specified on the command line with `--packages` or applied persistently by placing it at `.lake/package-overrides.json`. * [#6422](https://github.com/leanprover/lean4/pull/6422) fixes a bug in #6388 where the `Package.afterBuildCahe*` functions would produce different traces depending on whether the cache was fetched. * [#6627](https://github.com/leanprover/lean4/pull/6627) aims to fix the trace issues reported by Mathlib that are breaking `lake exe cache` in downstream projects. * [#6631](https://github.com/leanprover/lean4/pull/6631) sets `MACOSX_DEPLOYMENT_TARGET` for shared libraries (it was previously only set for executables). ## Other * [#6285](https://github.com/leanprover/lean4/pull/6285) upstreams the `ToLevel` typeclass from mathlib and uses it to fix the existing `ToExpr` instances so that they are truly universe polymorphic (previously it generated malformed expressions when the universe level was nonzero). We improve on the mathlib definition of `ToLevel` to ensure the class always lives in `Type`, irrespective of the universe parameter. * [#6363](https://github.com/leanprover/lean4/pull/6363) fixes errors at load time in the comparison mode of the Firefox profiler.