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.
conseqa-viz (format 4), which adds proof scope and remedy fields to earlier shapes. If you are consuming this output programmatically, pin against the format field at the top level.
Report Structure
The top-level report object contains the format version, the model revision the report was produced against, the list of obligations, and any model-wide notes."notes" array also appears at the top level. It is omitted entirely when there are none.
integer
required
The report format version.
conseqa-viz expects format 4 for reports produced by the current engine and warns when versions do not match.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 theobligations 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
Present for
proven obligations. l0_only if no L1 fact was required; runtime_dependent if at least one L1 fact was necessary. A runtime_dependent proof holds of the declared runtime realization and must be re-examined when that realization changes.string
Present for unproven (
unknown) serialization and ordering obligations. application if the missing facts belong to L0; runtime if they belong to L1. This is a routing hint, not a promise that declaring one fact closes the argument.string
required
A human-readable one-sentence description of what the obligation claims.
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 theflash_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, and check the scope field to know whether the proof depends on runtime topology.Using the report with conseqa-viz
Pass the report toconseqa-viz with --report to overlay proof verdicts on the architecture visualization:
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. The obligations panel includes a layer filter (any / L0 / L1) that uses scope for proven obligations and remedy for unproven ones.
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.
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.
Complete obligation ID structure
Complete obligation ID structure
Obligation IDs follow the pattern:For example:
oblig.operation.apply_payment.serialization.0— the first serialization requirement onoperation.apply_paymentoblig.operation.create_order.result_replay.0— the result replay obligation oncreate_order’s first idempotency requirement (which declaredresult: replay_consistent)