<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/creusot-0-14-0-release---contracts-for-rust-formally-proved-hpnnq0zbw" -->

---
title: Creusot 0.14.0 release - Contracts for Rust, formally proved
description: Creusot, a formal verification tool for Rust, released version 0.14.0 with several notable changes. Its specification of PartialOrd now supports partial orders...
canonical: https://daily.dev/posts/creusot-0-14-0-release---contracts-for-rust-formally-proved-hpnnq0zbw
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Creusot 0.14.0 release - Contracts for Rust, formally proved | daily.dev
og:description: Creusot, a formal verification tool for Rust, released version 0.14.0 with several notable changes. Its specification of PartialOrd now supports partial orders...
og:url: https://daily.dev/posts/creusot-0-14-0-release---contracts-for-rust-formally-proved-hpnnq0zbw
og:image: https://api.daily.dev/og/posts/Hpnnq0zbW.png
og:image:alt: Creusot 0.14.0 release - Contracts for Rust, formally proved
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Creusot 0.14.0 release - Contracts for Rust, formally proved

**[Lobsters](https://daily.dev/sources/lobsters)** · 6 min read · 7 upvotes · 0 comments

## Summary

Creusot, a formal verification tool for Rust, released version 0.14.0 with several notable changes. Its specification of PartialOrd now supports partial orders rather than only total orders, replacing the old Ordering-based comparison with a boolean lt_log function and separate totality laws. Creusot now generates verification conditions for snapshot! expressions, enabling logic functions to be used as lemma functions without needing to pass the borrow checker. Finally, rust-analyzer integration now supports Go-to-definition inside Pearlite specifications, achieved by expanding specification macros and fixing overly coarse token spans so lookups resolve to the precise identifier under the cursor.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://devlog.creusot.rs/v0-14-0>

## Questions this post answers

### What changed in Creusot's handling of PartialOrd between 0.13.0 and earlier versions?

Creusot relaxed its specification of PartialOrd to support partial orders instead of only total orders, starting in version 0.13.0. The old OrdLogic trait relied on a cmp_log function returning an Ordering, implying totality by construction. The new PartialOrdLogic trait uses a boolean lt_log comparison that is irreflexive and transitive, with totality expressed as a separate law requiring x < y, x == y, or y < x to hold.

_Developers tracking formal verification tooling changes can follow Rust ecosystem updates like this on daily.dev._

### How does Creusot 0.14.0 generate verification conditions for snapshot! macros?

Creusot 0.14.0 generates verification conditions for snapshot! expressions, translating a logic function call like lemma(n) inside snapshot! into an assertion of its precondition and an assumption of its postcondition, specialized to the concrete argument n. This avoids relying on provers to instantiate universal quantifiers and lets logic functions be used as lemma functions without needing to pass the borrow checker, unlike calling a program function.

_Engineers evaluating verification tools for Rust can keep up with releases like this via daily.dev._

### How does Go-to-definition work for Pearlite specifications in rust-analyzer with Creusot?

Creusot 0.14.0 makes Go-to-definition work in Pearlite specifications by configuring rust-analyzer to expand specification macros like requires, ensures, proof_assert!, and snapshot!, since rust-analyzer skips borrow checking and tolerates the resulting invalid-but-type-checked code. A span-granularity fix narrows generated token spans, for example giving add_logic the span of the + operator, so lookups resolve to the exact identifier under the cursor instead of returning many irrelevant results.

_Rust tooling users debugging editor integration issues can track fixes like this through daily.dev._

## Similar posts on daily.dev

- [nik-rev/awesome-tiny-crates: A bunch of small crates that make writing Rust more fun](https://daily.dev/posts/nik-rev-awesome-tiny-crates-a-bunch-of-small-crates-that-make-writing-rust-more-fun-jr8oyfeum) · Lobsters · 7 upvotes · 0 comments
- [This Week in Rust 635 · This Week in Rust](https://daily.dev/posts/this-week-in-rust-635-this-week-in-rust-rmgpe44ny) · This Week in Rust · 5 upvotes · 0 comments
- [Toasty, an async ORM for Rust, is now on crates.io](https://daily.dev/posts/toasty-an-async-orm-for-rust-is-now-on-crates-io-tj4ouwsoo) · Tokio · 1 upvotes · 0 comments

---

Tags: [#rust](https://daily.dev/tags/rust)

[View this post on daily.dev](https://daily.dev/posts/creusot-0-14-0-release---contracts-for-rust-formally-proved-hpnnq0zbw)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Creusot 0.14.0 release - Contracts for Rust, formally proved","url":"https://daily.dev/posts/creusot-0-14-0-release---contracts-for-rust-formally-proved-hpnnq0zbw","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/creusot-0-14-0-release---contracts-for-rust-formally-proved-hpnnq0zbw"},"datePublished":"2026-10-14T13:04:22.916Z","dateModified":"2026-10-14T13:04:52.801Z","description":"Creusot, a formal verification tool for Rust, released version 0.14.0 with several notable changes. Its specification of PartialOrd now supports partial orders...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/96b70ce687d9e05b8ca4d04fa8d7bc00?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/96b70ce687d9e05b8ca4d04fa8d7bc00?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Lobsters","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Lobsters","logo":"https://media.daily.dev/image/upload/s--tl8v_Fku--/f_auto,t_logo/v1698841318/logos/lobste.jpg","url":"https://daily.dev/sources/lobsters"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/creusot-0-14-0-release---contracts-for-rust-formally-proved-hpnnq0zbw","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":5},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"rust","timeRequired":"PT6M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Lobsters","item":"https://daily.dev/sources/lobsters"},{"@type":"ListItem","position":3,"name":"Creusot 0.14.0 release - Contracts for Rust, formally proved"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/creusot-0-14-0-release---contracts-for-rust-formally-proved-hpnnq0zbw#faq","mainEntity":[{"@type":"Question","name":"What changed in Creusot's handling of PartialOrd between 0.13.0 and earlier versions?","acceptedAnswer":{"@type":"Answer","text":"Creusot relaxed its specification of PartialOrd to support partial orders instead of only total orders, starting in version 0.13.0. The old OrdLogic trait relied on a cmp_log function returning an Ordering, implying totality by construction. The new PartialOrdLogic trait uses a boolean lt_log comparison that is irreflexive and transitive, with totality expressed as a separate law requiring x < y, x == y, or y < x to hold. Developers tracking formal verification tooling changes can follow Rust ecosystem updates like this on daily.dev."}},{"@type":"Question","name":"How does Creusot 0.14.0 generate verification conditions for snapshot! macros?","acceptedAnswer":{"@type":"Answer","text":"Creusot 0.14.0 generates verification conditions for snapshot! expressions, translating a logic function call like lemma(n) inside snapshot! into an assertion of its precondition and an assumption of its postcondition, specialized to the concrete argument n. This avoids relying on provers to instantiate universal quantifiers and lets logic functions be used as lemma functions without needing to pass the borrow checker, unlike calling a program function. Engineers evaluating verification tools for Rust can keep up with releases like this via daily.dev."}},{"@type":"Question","name":"How does Go-to-definition work for Pearlite specifications in rust-analyzer with Creusot?","acceptedAnswer":{"@type":"Answer","text":"Creusot 0.14.0 makes Go-to-definition work in Pearlite specifications by configuring rust-analyzer to expand specification macros like requires, ensures, proof_assert!, and snapshot!, since rust-analyzer skips borrow checking and tolerates the resulting invalid-but-type-checked code. A span-granularity fix narrows generated token spans, for example giving add_logic the span of the + operator, so lookups resolve to the exact identifier under the cursor instead of returning many irrelevant results. Rust tooling users debugging editor integration issues can track fixes like this through daily.dev."}}]}
```

