Skip to main content
This guide walks you through installing Conseqa from source, writing a minimal model, running your first verification, and exploring the result in the interactive visualizer. The model starts with the application itself and then adds a small amount of runtime topology so serialization can be proved. By the end you will have a working model on disk and know how to extend it.
1

Install Conseqa

Conseqa builds from source with the standard Rust toolchain. You need a recent stable Rust release; no other runtime dependencies are required.Clone the repository and build both binaries in release mode:
This produces two binaries:
  • target/release/conseqa — the validator and verifier
  • target/release/conseqa-viz — the visualization tool
Optionally add them to your PATH:
Confirm both tools are reachable:
The conseqa-viz front end is a pre-built React bundle embedded in the binary at compile time. You do not need Node.js to run it — only to rebuild the front end itself after modifying viz/.
2

Write a minimal model

Create a file called model.yaml. The model below declares a single backend service, a canonical schema for a completed upload, a data model with an outbox for typed messages, a keyed topic, and a complete operation. A short runtime block at the end pins request routing and pool concurrency so the operation’s serialization requirement can be discharged.
Each block serves a specific purpose:
  1. Data model with an outbox (data_models.data.videos.outboxes.outbox.video_events): A typed logical message collection that lives in the same transactional boundary as the data model’s objects. The transaction can atomically write objects and admit messages to this outbox in one commit.
  2. Topic (topics.topic.video_events): A logical channel that carries schema.VideoUploaded with keyed message identity on event_id.
  3. Operation (operations.operation.complete_upload): A request-driven operation with a transaction containing deduplicated_by on the request’s upload_id, a write_outbox step staging VideoUploaded atomically, and an establish_transaction_output step exporting values for the return.
  4. Runtime (runtime.execution_pools and runtime.routers): Realization facts. A serial execution pool plus a router that assigns request invocations onto that pool by consistent hash of upload_id. Adding these lets the verifier discharge the operation’s serialization requirement.
The completeness: complete declaration tells the verifier this schema describes the full logical shape. Fields absent from a complete schema are treated as nonexistent. Use partial when the real schema may contain undeclared fields.
3

Run the verifier

Pass your model to conseqa:
With the model above, the verifier checks idempotency and recoverability obligations and reports their verdicts:
Now try the fuller example from the repository’s test fixtures, which models a transactional outbox with a relay and downstream consumer:
For a model with deliberate gaps, run the flash checkout fixture. The checker reports each gap honestly:
unknown is epistemic: the verifier could not establish the property from the declared facts. It is not evidence of a violation. The flash checkout model deliberately leaves gaps in recoverability and idempotency for illustration.
To save the full obligation report as JSON for later use or visualization:
The JSON report follows the ProverReport format (format: 2). Each obligation object carries an id, property, subject, status, summary, assumptions, evidence, and scope (l0_only or runtime_dependent).
4

Generate a visualization

Run conseqa-viz with --verify to produce and overlay the obligation report in one step:
You can also overlay a report you produced earlier:
Other useful options:
5

Open the HTML output

Open the generated file in any browser. The visualization makes no external network requests and works directly from disk:
The visualization has three main views:
Services are drawn as boundary boxes with their operations inside. Topics, external systems, and a synthetic “clients” vertex sit around them. Edges are the model’s information routes: publications, subscriptions, request effects, and external effects. Solid edges carry program step details; dashed edges are declared but unexecuted capabilities. Click any vertex or edge for a structured detail panel.
Shows a page header with the operation’s facts, then its declared requirements (with obligation status when a report is loaded), its inputs, and a full program diagram — every step in order, transactions expanded in place, match/branch arms side by side, and step locations labeled as the checker names them (3, 3.ok.1).
Displays the state graph with legal states, the initial state, and transitions annotated with side effects. A transitions table shows from/to sets and the operations that execute each transition through an intent.
When a report is loaded, every vertex gains a status ring and a rollup chip (worst status wins: disproven > unknown > proven). The obligations panel groups obligations by the operation they anchor to, with a status filter and expandable evidence cards.

Next steps

Core Concepts

Learn how operations, requirements, and the proof mechanics fit together.

CLI Reference

Full reference for every flag on conseqa and conseqa-viz.