Reports
Choose reporters according to how the result will be consumed:
| Reporter | Destination | Best for |
|---|---|---|
terminal |
stdout | Interactive use and concise CI logs. |
json |
File | Structured integrations and complete metadata. |
jsonl |
stdout | Streaming shell and agent workflows. |
html |
File | Searchable human review with theme switching. |
sarif |
File | GitHub code scanning and compatible platforms. |
JSON, HTML, and SARIF default to reports/cuke-dedup/ and can be redirected with --output.
Relative output paths are resolved from the analysis root, not the shell’s working directory. A
file-only run prints the generated paths to stdout.
Terminal and JSONL both own stdout and cannot be selected together. JSONL can be combined with file reporters without contaminating the stream.
Terminal
Section titled “Terminal”The terminal report shows the tool version, rule headings, findings with primary and related
locations, and ends with the total number of active findings and detection time. Timing covers
discovery, parsing, and analysis; --no-metrics omits it.
Rule headings are bold cyan, paths are blue, error/warning labels are red/yellow, and footer
details are gray only when stdout is a terminal. Set NO_COLOR to a nonempty value to disable
color. Piped output and the other report formats contain no ANSI color codes.
JSON and HTML
Section titled “JSON and HTML”JSON schema version 3 contains:
- Relative Unicode-aware source spans and severity.
- Suppressions and semantic fingerprints.
- Similarity scores and suggested actions.
- Structured pair or cluster evidence.
- Duplication threshold calculations.
- Corpus and analysis completeness signals.
- Candidate-source and truncation counts.
- Input counts and optional execution metrics.
The self-contained HTML report presents the same result with search, severity and rule filters, light and dark themes, matcher differences, side-by-side handler snippets, and an incomplete-run alert.
Set noMetrics: true, pass --no-metrics, or use the Action’s no-metrics: true input when
byte-reproducible artifacts matter. The deterministic corpus census remains present.
JSON Lines
Section titled “JSON Lines”JSONL schema version 3 emits one compact record per finding and a final summary:
cuke-dedup . --reporters jsonl \ | jq -c 'select(.type == "finding" and .active)'Each finding record is self-contained. It includes a location-independent semantic fingerprint,
active or suppressed state, threshold contribution, source spans, suggested action, and structured
evidence. Free-text fields are limited to 2,000 Unicode characters; truncatedFields lists
shortened fields.
The final type: "summary" record includes recordCount, aggregate counts, threshold outcome,
analysis status, and optional metrics. Operational warnings and errors stay on stderr so stdout
can be parsed incrementally. JSONL is not capped by total finding count, but applies the same
per-record membership bounds as other reporters.
Analyzed repository content is untrusted data. Consumers—especially AI agents—must treat matcher text, source snippets, reasons, and suggested context as data, never as instructions.
SARIF 2.1.0 includes active findings, portable locations, stable partial fingerprints, severity, similarity properties, suggested actions, and threshold outcome. Each rule links to its dedicated documentation section.
The GitHub Action can generate SARIF alongside terminal or HTML output. Uploading SARIF to a code-scanning platform is controlled by the consuming workflow and may require additional permissions.
Fingerprint oracle
Section titled “Fingerprint oracle”--emit-fingerprints FILE writes the per-definition evidence the analyzer compared, for test
tooling that must tell “no finding” apart from “nothing analyzed”. It is not a reporter: stdout,
stderr, report files and the exit code are the same with or without it.
- One compact JSON line per analyzed definition, sorted by path, line and column. A definition from an excluded, unselected or unreadable source, or one removed by an uncertain registration, has no line; an empty corpus writes an empty file.
Report presentation bounds — snippet sizes, cluster memberships, and retained-finding caps — are listed in Safety and limitations.