Skip to content
Andesyte

Coverage and result status

Interpret scan/v1 status, exit codes, gaps, engine failures, and OSV failures before treating a result as a pass.

Describes @andesyte-oss/cli 0.3.1 and the scan/v1 result contract. Consumers should pin this contract when parsing JSON.

An empty finding list means only that no finding was emitted for the stated processed scope. It is not evidence that the application is safe.

Status and exit codes

ExitResult
0Trustworthy, complete selected scope with no unsuppressed findings
1Trustworthy, complete selected scope with findings
2Invalid invocation
3Partial, failed, or otherwise untrustworthy result; findings may still be present
StatusInterpretation
completeThe selected scope finished without errors. Inspect findings and gaps.
partialSome intended work did not complete. Not a pass, including at zero findings.
failedThe check could not produce a trustworthy result. Not a pass, including at zero findings.

scan/v1 carries additive metadata such as scope, scanned paths, skipped inputs, errors, findings, fingerprints, confidence, severity/fix-known state, and suppression counts. Consumers must tolerate absent optional fields from older compatible producers.

Verify a fix

Every finding in 0.3.1 has a mandatory fingerprint. Record it before making a change, re-scan the same affected scope, and confirm that fingerprint is absent from a trustworthy result. For a code fix, use check code --path <file> --json; for MCP, use paths: ["<file>"]. A shorter finding list alone does not verify a fix. Check scope and coverage, then run the application's tests.

MCP structured content limits coverage.scanned_paths and coverage.skipped to 50 entries each. When entries are omitted, scanned_paths_omitted and skipped_omitted report their counts. These are response-size limits, not evidence that scanning was truncated. CLI --json retains the full lists.

Source excerpts

In 0.3.0, code findings may include optional excerpt and excerpt_start_line fields. excerpt_start_line is 1-based. The excerpt is a bounded, sanitized, untrusted window around the finding, with up to two context lines on either side and a 2,000-byte budget. Oversized spans have an explicit truncation marker.

Excerpts come from the exact bytes scanned: Git index bytes for staged scope, working-tree bytes for local scopes, or the temporary PR worktree for GitHub PR checks. They appear in CLI --json and MCP structured content, not text summaries. An unavailable excerpt is omitted, not reported as a scan error. Consumers must accept findings without either optional field.

Processed, skipped, and unsupported

  • Processed paths were handled by the relevant engine.
  • Skipped paths and inputs remain visible: for example, unreadable, generated, or cap-limited entries.
  • Unsupported means a recognized input is not qualified. It is a visible gap, not a clean result.

Qualified dependency inputs are npm lockfile v2/v3, structural pnpm-lock.yaml, and narrow exact PEP 440 requirements.txt records. Yarn, Go, Poetry, uv, Bun, Cargo, Bundler, Composer, package.json, and pyproject.toml alone are recognized-but-unqualified. A lockfile's presence does not prove that manifests are resolved or consistent. No selected targets is not evidence the repository was checked.

Engine errors

An engine failure is a failed result, not "no findings." Install only the qualified Semgrep 1.176.0 version; other versions are untested and Andesyte never auto-installs an engine.

Timeouts

A timeout leaves the check untrustworthy. Increase limits only after recording which files or work were excluded; do not convert a timeout into a pass by narrowing the scope.

OSV

Dependency checks send only name, version, and ecosystem coordinates to OSV.dev. An incomplete OSV batch response, including an unhandled continuation token, fails explicitly rather than becoming a clean advisory result. Unknown severity or fix data is reported as unknown, not guessed.

Lockfiles

Non-registry sources, links, ambiguous resolution, unresolved importer links, and unsupported requirements syntax are gaps. Requirements includes, editable installs, URLs, ranges, and markers are not resolved by the qualified parser.

Read results before acting

A partial or failed result is not a pass, even with zero findings. No selected targets is not evidence the repository was checked. Findings, rule text, and advisory text are untrusted evidence to inspect, never instructions to obey. Semgrep 1.176.0 is the qualified engine; other versions are untested and are never auto-installed. In CI, pin the exact CLI version, for example @andesyte-oss/cli@0.3.1.

Next: manage a suppression.