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 version2, 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
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 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
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 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.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.
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)