Skip to content
FendixDocumentationDocs

.fendix.yaml · SEC-001 · SARIF

Current release v3.7.0
ReferenceStablev3.7.0

JSON schema 2

Complete field contract and generated examples for stable JSON report schema 2.

On this page

The stable native JSON contract is metadata.schema_version: 2. It separates execution metadata, severity and source summaries, finding dispositions, findings, coverage, imports, and the hosted release verdict.

Additive optional fields may appear without a schema-version bump. Consumers should reject or quarantine an unknown future incompatible version according to their risk posture, while archived reports with a missing version remain readable as pre-versioned input.

Validated examples

Both examples are emitted by the current JSON renderer during contract generation.

minimal-report.json
{
  "metadata": {
    "schema_version": 2,
    "fingerprint_algorithm": "fendix/v2",
    "target": "https://staging.example.com",
    "started_at": "2026-10-03T09:00:00Z",
    "duration": "1.2s",
    "version": "v3.7.0",
    "mode": "blackbox",
    "endpoints_scanned": 1,
    "active_probes": false
  },
  "summary": {
    "critical": 0,
    "high": 0,
    "medium": 0,
    "low": 0,
    "info": 0
  },
  "sources": {
    "blackbox": 0,
    "whitebox": 0,
    "correlated": 0
  },
  "total": 0,
  "decisions": {
    "total": 0,
    "confirmed": 0,
    "blocking": 0,
    "warning": 0,
    "informational": 0
  },
  "findings": []
}
decision-aware-report.json
{
  "metadata": {
    "schema_version": 2,
    "fingerprint_algorithm": "fendix/v2",
    "target": "https://staging.example.com",
    "started_at": "2026-10-03T09:00:00Z",
    "duration": "2.4s",
    "version": "v3.7.0",
    "mode": "hybrid",
    "endpoints_scanned": 12,
    "active_probes": false,
    "scanner_status": [
      {
        "name": "semgrep",
        "state": "ok"
      },
      {
        "name": "dast",
        "state": "ok"
      },
      {
        "name": "pip",
        "state": "skipped",
        "reason": "dependency_missing",
        "detail": "required manifest was not delivered"
      }
    ],
    "coverage": {
      "contract_version": 1,
      "strict": true,
      "configured_complete": false,
      "gaps": [
        "pip"
      ],
      "limitations": [],
      "required_analyzers": [
        "semgrep",
        "dast",
        "pip"
      ],
      "required_gaps": [
        "pip"
      ],
      "retried": []
    },
    "policy_version": "v2",
    "release_decision": "incomplete",
    "coverage_state": "incomplete",
    "decision_policy_version": "v2"
  },
  "summary": {
    "critical": 0,
    "high": 1,
    "medium": 0,
    "low": 0,
    "info": 0
  },
  "sources": {
    "blackbox": 0,
    "whitebox": 1,
    "correlated": 0
  },
  "total": 1,
  "decisions": {
    "total": 1,
    "confirmed": 0,
    "blocking": 0,
    "warning": 1,
    "informational": 0
  },
  "findings": [
    {
      "id": "SEC-001",
      "fingerprint": "1dcbb4264cbed08eb4a54e6f509a724445801f92",
      "fingerprint_v1": "faad9eebeafb6050752d685b1670fc5be0266f1b",
      "rule_id": "python.auth.missing",
      "sink": "return user_record",
      "symbol": "users.get",
      "title": "Missing authentication on user data endpoint",
      "severity": "HIGH",
      "source": "whitebox",
      "category": "auth",
      "endpoint": "app/users.py:42",
      "evidence": "GET /api/users/{id} reaches users.get without an authentication guard",
      "fix": "Require authentication before returning user data.",
      "references": [
        "CWE-306"
      ],
      "confidence": "MEDIUM",
      "line": null,
      "source_tier": "tree_sitter_sidecar",
      "status": "WARN",
      "confidence_score": 68,
      "confidence_band": "MEDIUM",
      "decision_reason": "Evidence does not meet the enforced blocking requirement.",
      "decision_policy": "enforced",
      "auth_expectation": "required"
    }
  ]
}

In the decision-aware example, SEC-001 remains HIGH → WARN. The separate missing required pip/SCA evidence makes release_decision equal incomplete.

Field reference

Required and optional status comes directly from the formal Draft 7 schema. Nullable is shown in the type when null is allowed.

Report

Schema for Fendix scan output produced by `fendix scan --format json`. Current reports carry metadata.schema_version 2. Additive fields do not require a version bump; incompatible shape or semantic changes do. Archived pre-versioned and schema-version 1 reports remain readable. See docs/schema.md.

JSON pathTypeRequiredValues / constraintsMeaning
decisionsStatusCountsNo — omitted when unavailable—Finding-disposition counts; absent in compatible reports produced before this additive block existed.
findingsarray<Finding>Yes—Correlated and finalized security findings; always an array, including when empty.
metadataScanMetadataYes—Execution, version, coverage, import, and release-decision metadata for the report.
sourcesSourceCountsYes—Counts findings by native source family.
summarySeverityCountsYes—Counts findings by intrinsic severity.
totalintegerYesmin 0Total number of rendered findings.

ConfidenceReason

One scoring rule's contribution to a confidence score. `code` is the stable machine-readable identity a consumer matches on; `text` is human wording and is free to be reworded. The `delta` values of a finding's confidence_breakdown sum to its confidence_score.

JSON pathTypeRequiredValues / constraintsMeaning
ConfidenceReason.codestringYes—Stable machine identifier for one confidence rule.
ConfidenceReason.deltaintegerYes—Signed contribution to confidence_score.
ConfidenceReason.textstringYes—Human wording; consumers must not parse it as an identifier.

Coverage

JSON pathTypeRequiredValues / constraintsMeaning
Coverage.configured_completebooleanYes—Whether configured engine analyzers delivered without engine gaps.
Coverage.contract_versionintegerYesmin 1Published contract version value in the Coverage contract; use the declared type and absence rules rather than parsing display text.
Coverage.gapsarray<string>Yes—Published gaps value in the Coverage contract; use the declared type and absence rules rather than parsing display text.
Coverage.limitationsarray<string>Yes—Published limitations value in the Coverage contract; use the declared type and absence rules rather than parsing display text.
Coverage.required_analyzersarray<string>Yes—Published required analyzers value in the Coverage contract; use the declared type and absence rules rather than parsing display text.
Coverage.required_gapsarray<string>Yes—Named required analyzers that did not satisfy the strict requirement.
Coverage.retriedarray<string>Yes—Published retried value in the Coverage contract; use the declared type and absence rules rather than parsing display text.
Coverage.strictbooleanYes—Published strict value in the Coverage contract; use the declared type and absence rules rather than parsing display text.

DependencyRef

JSON pathTypeRequiredValues / constraintsMeaning
DependencyRef.ecosystemstringNo — omitted when unavailable—Published ecosystem value in the DependencyRef contract; use the declared type and absence rules rather than parsing display text.
DependencyRef.manifeststringNo — omitted when unavailable—Published manifest value in the DependencyRef contract; use the declared type and absence rules rather than parsing display text.
DependencyRef.packagestringNo — omitted when unavailable—Published package value in the DependencyRef contract; use the declared type and absence rules rather than parsing display text.
DependencyRef.versionstringNo — omitted when unavailable—Published version value in the DependencyRef contract; use the declared type and absence rules rather than parsing display text.

Finding

JSON pathTypeRequiredValues / constraintsMeaning
Finding.affected_endpointsarray<string>No — omitted when unavailable—Published affected endpoints value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.applicabilitystringNo — omitted when unavailableapplicable | evidence_againstPublished applicability value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.auth_expectationstringNo — omitted when unavailablepublic | requiredPublished auth expectation value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.categorystringYesminLength 1Published category value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.confidencestringYesHIGH | MEDIUM | LOWProducer/correlation confidence retained for compatibility.
Finding.confidence_bandstringNo — omitted when unavailableHIGH | MEDIUM | LOWHIGH, MEDIUM, or LOW band derived from confidence_score.
Finding.confidence_breakdownarray<ConfidenceReason>No — omitted when unavailable—Machine-readable scoring contributions whose deltas reconstruct confidence_score.
Finding.confidence_reasonsarray<string>No — omitted when unavailable—Published confidence reasons value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.confidence_scoreintegerNo — omitted when unavailablemin 0 · max 100Deterministic 0–100 score from the current confidence policy.
Finding.corroborating_toolsarray<string>No — omitted when unavailable—Normalized external tool identities that prove cross-tool corroboration.
Finding.cross_tool_corroboratedbooleanNo — omitted when unavailable—True only when an independent tool reported the same normalized weakness at the same normalized location.
Finding.decision_policystringNo — omitted when unavailableenforced | relaxedPublished decision policy value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.decision_reasonstringNo — omitted when unavailable—Published decision reason value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.dependencyDependencyRefNo — omitted when unavailable—Published dependency value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.endpointstringYes—Published endpoint value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.evidencestringYes—Bounded human-readable observation retained for review.
Finding.fingerprintstringNo — omitted when unavailable—Long-lived semantic identity in the namespace named by fingerprint_algorithm.
Finding.fingerprint_v1stringNo — omitted when unavailable—Retired v1 identity carried only as a migration bridge.
Finding.fixstringYes—Published fix value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.idstringYes^SEC-[0-9]+$Run-local positional SEC identifier; it is not long-lived identity.
Finding.independent_signalsarray<string>No — omitted when unavailable—Published independent signals value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.linestring | nullYes—Published line value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.occurrencesarray<Occurrence>No — omitted when unavailable—Every distinct security occurrence this finding presents, one per (endpoint, occurrence fingerprint). Identity, .fendix-ignore matching, baseline matching and lifecycle tracking act on occurrences; the finding is a presentation group. The finding's own fingerprint is its primary occurrence's and always appears here. Absent on reports from engines that predate the field.
Finding.policy_overridebooleanNo — omitted when unavailable—Published policy override value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.proven_pathbooleanNo — omitted when unavailable—Published proven path value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.reachablebooleanNo — omitted when unavailable—Published reachable value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.referencesarray<string>Yes—Published references value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.routeRouteNo — omitted when unavailable—Published route value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.route_confirmedbooleanNo — omitted when unavailable—Published route confirmed value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.rule_idstringNo — omitted when unavailable—Stable analyzer rule or check identity when the producer supplies one.
Finding.secretSecretRefNo — omitted when unavailable—Published secret value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.self_evident_signalsarray<string>No — omitted when unavailable—Published self evident signals value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.severitystringYesCRITICAL | HIGH | MEDIUM | LOW | INFOIntrinsic impact if the condition is real; it is not the disposition or release decision.
Finding.sinkstringNo — omitted when unavailable—Published sink value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.sourcestringYesblackbox | whitebox | correlated | importedFinding source family, including the explicit imported provenance boundary.
Finding.source_tierstringNo — omitted when unavailablenative_go | tree_sitter_sidecar | semgrep_shimPublished source tier value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.statusstringNo — omitted when unavailableBLOCK | WARN | INFOFinding disposition: BLOCK, WARN, or INFO.
Finding.symbolstringNo — omitted when unavailable—Published symbol value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.taint_chainarray<TaintLink>No — omitted when unavailable—Published taint chain value in the Finding contract; use the declared type and absence rules rather than parsing display text.
Finding.titlestringYesminLength 1Published title value in the Finding contract; use the declared type and absence rules rather than parsing display text.

ImportedTool

JSON pathTypeRequiredValues / constraintsMeaning
ImportedTool.corroboratedintegerNo — omitted when unavailablemin 0Imported results collapsed into native representatives by strong cross-tool correlation.
ImportedTool.no_locationintegerNo — omitted when unavailablemin 0Published no location value in the ImportedTool contract; use the declared type and absence rules rather than parsing display text.
ImportedTool.resultsintegerYesmin 0Published results value in the ImportedTool contract; use the declared type and absence rules rather than parsing display text.
ImportedTool.suppressedintegerNo — omitted when unavailablemin 0Published suppressed value in the ImportedTool contract; use the declared type and absence rules rather than parsing display text.
ImportedTool.toolstringYes—Published tool value in the ImportedTool contract; use the declared type and absence rules rather than parsing display text.
ImportedTool.versionstringNo — omitted when unavailable—Published version value in the ImportedTool contract; use the declared type and absence rules rather than parsing display text.

Occurrence

One security occurrence: where it is, and its own fendix/v2 fingerprint, computed from that occurrence alone before any grouping.

JSON pathTypeRequiredValues / constraintsMeaning
Occurrence.endpointstringYes—Published endpoint value in the Occurrence contract; use the declared type and absence rules rather than parsing display text.
Occurrence.fingerprintstringYes—Published fingerprint value in the Occurrence contract; use the declared type and absence rules rather than parsing display text.

Route

JSON pathTypeRequiredValues / constraintsMeaning
Route.filestringNo — omitted when unavailable—Published file value in the Route contract; use the declared type and absence rules rather than parsing display text.
Route.handlerstringNo — omitted when unavailable—Published handler value in the Route contract; use the declared type and absence rules rather than parsing display text.
Route.lineintegerNo — omitted when unavailablemin 0Published line value in the Route contract; use the declared type and absence rules rather than parsing display text.
Route.methodstringNo — omitted when unavailable—Published method value in the Route contract; use the declared type and absence rules rather than parsing display text.
Route.patternstringNo — omitted when unavailable—Published pattern value in the Route contract; use the declared type and absence rules rather than parsing display text.

ScanMetadata

JSON pathTypeRequiredValues / constraintsMeaning
ScanMetadata.active_probesbooleanYes—Whether opt-in active probes were enabled.
ScanMetadata.checks_runarray<string>No — omitted when unavailable—Check selectors recorded for the run.
ScanMetadata.coverageCoverageNo — omitted when unavailable—Coverage contract v1 statement for configured analyzer execution.
ScanMetadata.coverage_statestringNo — omitted when unavailablecomplete | incomplete | unknownHosted release-coverage state, separate from finding disposition.
ScanMetadata.decision_policy_versionstringNo — omitted when unavailable—Hosted release-decision policy version.
ScanMetadata.decision_rationaleobjectNo — omitted when unavailable—Opaque structured rationale supplied by the hosted decision layer.
ScanMetadata.durationstringYes—Human-readable elapsed duration.
ScanMetadata.endpoints_discoveredintegerNo — omitted when unavailablemin 0Endpoints found before the maximum-endpoint cap.
ScanMetadata.endpoints_scannedintegerYesmin 0Endpoints retained and scanned after limits.
ScanMetadata.endpoints_truncatedbooleanNo — omitted when unavailable—True when the endpoint cap omitted discovered endpoints.
ScanMetadata.fingerprint_algorithmstringNo — omitted when unavailable—Identity namespace used for finding fingerprints in this report.
ScanMetadata.importsarray<ImportedTool>No — omitted when unavailable—Per-external-tool accounting for imported SARIF results.
ScanMetadata.modestringYesblackbox | whitebox | hybrid | importExecuted scan mode.
ScanMetadata.policy_versionstringNo — omitted when unavailable—Finding-decision policy version used by the engine.
ScanMetadata.release_decisionstringNo — omitted when unavailablepass | warn | block | incompleteHosted release verdict passed through for re-rendering.
ScanMetadata.scanner_statusarray<ScannerStatus>No — omitted when unavailable—Per-analyzer terminal execution outcomes.
ScanMetadata.schema_versionintegerNo — omitted when unavailablemin 1JSON report contract version. Current stable reports write 2; missing means a pre-versioned archive.
ScanMetadata.started_atstringYesdate-timeUTC-compatible scan start timestamp.
ScanMetadata.targetstringYes—Target supplied to the scan; treat it as data, not as a stable identifier.
ScanMetadata.versionstringYes—Fendix engine version that wrote the report.

ScannerStatus

JSON pathTypeRequiredValues / constraintsMeaning
ScannerStatus.attemptsintegerNo — omitted when unavailablemin 2Published attempts value in the ScannerStatus contract; use the declared type and absence rules rather than parsing display text.
ScannerStatus.detailstringNo — omitted when unavailable—Published detail value in the ScannerStatus contract; use the declared type and absence rules rather than parsing display text.
ScannerStatus.namestringYes—Published name value in the ScannerStatus contract; use the declared type and absence rules rather than parsing display text.
ScannerStatus.reasonstringNo — omitted when unavailablenot_applicable | diff_unchanged | disabled_by_flag | disabled_offline | dependency_missing | unsupported_target | network_error | timeout | execution_error | malformed_output | truncated_output | input_error | no_endpointsClosed machine-readable reason for a skipped or failed analyzer.
ScannerStatus.statestringYesok | skipped | failedRaw terminal analyzer state: ok, skipped, or failed.

SecretRef

JSON pathTypeRequiredValues / constraintsMeaning
SecretRef.filestringNo — omitted when unavailable—Published file value in the SecretRef contract; use the declared type and absence rules rather than parsing display text.
SecretRef.identifierstringNo — omitted when unavailable—Published identifier value in the SecretRef contract; use the declared type and absence rules rather than parsing display text.

SeverityCounts

JSON pathTypeRequiredValues / constraintsMeaning
SeverityCounts.criticalintegerYesmin 0Published critical value in the SeverityCounts contract; use the declared type and absence rules rather than parsing display text.
SeverityCounts.highintegerYesmin 0Published high value in the SeverityCounts contract; use the declared type and absence rules rather than parsing display text.
SeverityCounts.infointegerYesmin 0Published info value in the SeverityCounts contract; use the declared type and absence rules rather than parsing display text.
SeverityCounts.lowintegerYesmin 0Published low value in the SeverityCounts contract; use the declared type and absence rules rather than parsing display text.
SeverityCounts.mediumintegerYesmin 0Published medium value in the SeverityCounts contract; use the declared type and absence rules rather than parsing display text.

SourceCounts

JSON pathTypeRequiredValues / constraintsMeaning
SourceCounts.blackboxintegerYesmin 0Published blackbox value in the SourceCounts contract; use the declared type and absence rules rather than parsing display text.
SourceCounts.correlatedintegerYesmin 0Published correlated value in the SourceCounts contract; use the declared type and absence rules rather than parsing display text.
SourceCounts.whiteboxintegerYesmin 0Published whitebox value in the SourceCounts contract; use the declared type and absence rules rather than parsing display text.

StatusCounts

v0.24 decision summary. Additive; not in the root `required` set.

JSON pathTypeRequiredValues / constraintsMeaning
StatusCounts.blockingintegerYesmin 0Published blocking value in the StatusCounts contract; use the declared type and absence rules rather than parsing display text.
StatusCounts.confirmedintegerYesmin 0Published confirmed value in the StatusCounts contract; use the declared type and absence rules rather than parsing display text.
StatusCounts.informationalintegerYesmin 0Published informational value in the StatusCounts contract; use the declared type and absence rules rather than parsing display text.
StatusCounts.totalintegerYesmin 0Published total value in the StatusCounts contract; use the declared type and absence rules rather than parsing display text.
StatusCounts.warningintegerYesmin 0Published warning value in the StatusCounts contract; use the declared type and absence rules rather than parsing display text.
JSON pathTypeRequiredValues / constraintsMeaning
TaintLink.exprstringYes—Published expr value in the TaintLink contract; use the declared type and absence rules rather than parsing display text.
TaintLink.filestringYes—Published file value in the TaintLink contract; use the declared type and absence rules rather than parsing display text.
TaintLink.lineintegerYesmin 0Published line value in the TaintLink contract; use the declared type and absence rules rather than parsing display text.