Skip to main content
When you run conseqa with --report, the verifier writes a structured JSON file containing every obligation it evaluated: its status, the declared facts the proof depends on, and the checker’s evidence for gaps. This report is the machine-readable interface between Conseqa and visualization, CI, and any custom tooling you build.

Report Structure

The top-level report object has format version 2, the model revision the report was produced against, the list of obligations, and any model-wide notes.
When the verifier raises model-wide notes, a "notes" array also appears at the top level. It is omitted entirely when there are none.
integer
required
Always 2 for reports produced by the current engine. conseqa-viz warns if a report’s format version does not match what it expects.
integer
The revision value from the model at the time the report was produced. conseqa-viz warns when you overlay a report against a model whose revision does not match.
Obligation[]
required
One entry per declared requirement. See the obligation fields below.
EvidenceItem[]
Model-wide warnings not tied to a specific obligation. Omitted from the JSON when empty. The most common note is raised when a subscription admits duplicate deliveries (at_least_once) but the operation declares no idempotency requirement keyed from it.

Obligation Fields

Each obligation in the obligations array describes one declared requirement and the verifier’s findings about it.
string
required
A stable logical identifier for the obligation, derived from the operation and requirement index. Example: oblig.operation.apply_payment.idempotency.0.
object
required
The requirement family. The kind field is one of serialization, ordering, idempotency, recoverability, or result_replay.
object
required
What the obligation anchors to. The kind field is one of operation, transaction, object, state_machine, or topic. For operation obligations, the subject also names the operation id and the requirement index within that operation’s requirement list.
string
required
The verdict: proven, unknown, or disproven. See Verdicts for the precise meaning of each.
string
required
A human-readable one-sentence description of what the obligation claims. Example: "Repeated attempts at operation.apply_payment sharing the declared key produce the effects of a single invocation."
string[]
required
For proven obligations: the declared facts the proof depends on, enumerated as human-readable statements. The proof holds only as long as your implementation actually provides these semantics.
EvidenceItem[]
required
For unknown or disproven obligations: the checker’s obstacles, each with an optional subject ID naming the entity involved and a message describing the gap. For proven obligations this is an empty array.
object
Present only for disproven obligations. Contains a trace array of TraceStep objects demonstrating the violation.

A Real Report Snippet

The following excerpt is from the flash_checkout example model’s report, produced by running Conseqa against that model. It shows one proven obligation and one unknown obligation side by side.
The assumptions list for a proven obligation names every declared fact the proof depends on. Review these after any implementation change to confirm the real system still provides those semantics.

Using the Report with conseqa-viz

Pass the report to conseqa-viz with --report to overlay proof verdicts on the architecture visualization:
Or run the model checker and overlay the results in one step:
When a report is loaded, conseqa-viz colors operations, topics, and state machines by their worst obligation status, adds verdict chips to requirement rows in the operation view, and populates the obligations panel with expandable cards showing assumptions, evidence, and counterexample traces.

Scaffolding a Report with --example-report

The --example-report flag on conseqa-viz generates a scaffold report in which every obligation implied by the model is listed with its status set to unknown. This is useful for understanding the report format, annotating obligations manually, or bootstrapping a custom report for tooling that consumes the format.
The scaffold follows the same format as a real report. Every assumptions and evidence array is empty; every status is "unknown". You can edit the scaffold and pass it back to conseqa-viz --report to overlay custom annotations.
Obligation IDs follow the pattern:
For example:
  • oblig.operation.apply_payment.serialization.0 — the first serialization requirement on operation.apply_payment
  • oblig.operation.create_order.result_replay.0 — the result replay obligation on create_order’s first idempotency requirement (which declared result: replay_consistent)
IDs are stable within a model revision. If you add or remove requirements, indices change for requirements declared later in the same list.