Skip to main content
jstm agent conform prints one merged report. This page explains every part of it.

Human output

Line by line:
  • Conformance: spec <id> — the spec pack you were checked against, as v05@<hash>. The hash pins the exact spec content.
  • lanes: … — which lanes ran. ran means it completed. did_not_run means it was filtered out or failed.
  • One block per flag: [severity] RULE_ID (target) id=… followed by an indented rationale. The full id is printed so you can copy it into --ignore <id>.
  • The verdict line: PASS or FAIL, a per-lane count, how many flags were ignored, and the exit code.

Anatomy of a flag

Every flag, human or JSON, has the same fields. The id is deliberately keyed on stable structure, not wording. A semantic judge may rephrase its rationale run to run, but the rule, target, and violation class stay put — so the id stays put, and so does any acknowledgement you’ve made.

Severity

Severity comes from the lane’s default, which a spec rule can override:
  • schema defaults to error, because it is authoritative.
  • judge and spec_conflict default to warning, because they are advisory, unless the rule sets an override. The lifecycle spec conflict is one such override, at error.
Only flags at or above the --fail-on threshold, which defaults to error, affect the exit code. Warnings are always visible but non-fatal by default.

JSON output

--json emits the full report as a single JSON line, for CI and tooling.
  • flags — the active, un-ignored flags that count toward the verdict.
  • ignored — flags suppressed by an acknowledgement. Only populated when you pass --show-ignored. Excluded from summary counts and the exit code.
  • summary — per-lane active counts plus ignored.
  • lane_errors — if a lane crashed, its error type is recorded here and the lane shows did_not_run in lanes_run.

Exit codes

A required lane that doesn’t run fails closed. If you filter the schema or spec_conflict lane out with --source, or it errors, the run cannot certify and exits 1 even with zero flags. “We didn’t check” is never a pass.
With --fail-on none, flags become purely advisory: the run exits 0 regardless of severity, and only a degraded required lane still forces 1.

See also