proven, unknown, or disproven, for every requirement.
The application layer is a logical description of the system, deliberately independent of any particular deployment. When you need to reason about how the architecture actually scales, you layer runtime topology on top: routing, pool concurrency, transport ordering, storage partitioning, and outbox dispatch. That topology is optional, and when present it may also participate in proofs whose conclusions depend on it.
Correctness properties Conseqa verifies
Conseqa focuses on five families of correctness obligations at the operation level:- Idempotency. Repeated attempts representing the same logical invocation must not cause externally distinguishable duplicate work. Proved across the full cascade: transactions, publications, outbound requests, external effects, and outbox writes.
- Result replay. For requirements that declare
result: replay_consistent, repeated attempts in the same idempotency class must return the same result variant and replay-equivalent payload. - Serialization. Same-key invocations must not execute concurrently.
- Ordering. Same-key invocations for which a meaningful logical precedence exists must preserve that precedence through execution.
- Recoverability. The logical invocation must reach a valid terminal after any modeled interruption. A progress obligation, distinct from idempotency.
What you declare
At the model root you describe the application itself:services, schemas, data_models (including any typed outboxes owned by a data model), topics, state_machines, and operations. Each operation names its invocation sources (request, subscription, or outbox), spells out one explicit causal program, and lists the requirements it must satisfy. This description stands on its own: the verifier can validate structural coherence and discharge many correctness obligations from these facts alone.
Some obligations, particularly ones about ordering, serialization under contention, and recoverability under redelivery, only close once you also describe how the architecture runs. For that, an optional runtime block declares realization facts: execution pools with member_concurrency, routers that assign requests onto pools, transport grouping and ordering, subscription and outbox delivery and dispatch, and storage layouts. These declarations serve two audiences: the verifier, which may consume them to close proofs, and an external quantitative analysis (hot members, routing skew, queue growth, pool sizing) that reads the same declarations at scenario time. Runtime declarations are qualitative; numbers like member counts and traffic rates stay outside the model.
Every proof records which declarations it consumed, so it is always clear what a verdict rests on and what would change it.
The three verdicts
Every obligation comes backproven, unknown, or disproven:
The two CLI tools
conseqa validates the YAML model and verifies its requirements. Validation errors are fatal; verification proceeds only over a coherent model. After verification, it prints a summary and optionally writes a JSON obligation report.
conseqa-viz renders the model as a single self-contained HTML file with a system graph, per-operation program drill-downs, and state-machine views. Pass --verify to overlay proof verdicts, or --report to overlay a previously produced report.
Quickstart
Write and verify your first model in minutes.
Model Overview
Core entities: services, operations, transactions, effects.
Runtime Topology
Routing, pools, transport ordering, and outbox dispatch.
How Verification Works
Forward analysis, per-path reasoning, and fixpoint computation.
DSL Model Structure
The canonical shape of a Conseqa YAML model.