Repo Preflight writes JSON reports for automation, baselines, and downstream review tools.
The report is a deterministic preflight output for release-discipline signals. It is not a security scanner, compliance scanner, vulnerability scanner, or replacement for human review.
The machine-readable JSON Schema artifact for report consumers is expected at:
docs/report.schema.json
Use that artifact as the validation contract for reports produced with --out-json. This page explains the same contract in human-readable form and describes the compatibility boundaries that automation should rely on.
Recommended automation flow:
- Generate a JSON report with
--out-json. - Read
schema_versionfrom the report before applying strict parsing logic. - Validate the report against
docs/report.schema.jsonfrom the same released kit version when the artifact is available. - Gate on
decisionfor coarse pass/fail behavior. - Use
countsandfindings[*].codefor dashboards, trend reporting, routing, and baseline workflows.
Consumers should vendor or pin the schema artifact with the scanner version they run. Do not fetch an unpinned schema from a different branch or release and assume it describes the report you just produced.
For reports with the same major schema_version, automation may assume:
- Required top-level fields documented here keep their meaning.
decisionremains the coarse automation gate and isREADYorBLOCKED.counts.blocker,counts.warning, andcounts.inforemain integer finding totals.findingsremains an array of finding objects.findings[*].levelremains one ofblocker,warning, orinfo.findings[*].coderemains the preferred stable grouping key for automation.
Consumers must allow:
- Additional top-level fields.
- Additional fields inside nested objects.
- New finding
codevalues. - New profile names.
- Optional privacy-sensitive fields such as
lineorevidenceto be missing, null, empty, truncated, redacted, or path-reduced depending on CLI options.
A future major schema_version may change required fields, field meanings, enum values, or baseline matching behavior. Treat that as a contract break and require an explicit consumer update.
This schema does not define the Markdown, HTML, or SARIF report formats. SARIF has its own compatibility surface; see SARIF output.
{
"schema_version": "1.0",
"repo": ".",
"profile": "public-export",
"decision": "READY",
"counts": {
"blocker": 0,
"warning": 0,
"info": 0
},
"findings": [],
"baseline_diff": {
"new": 0,
"resolved": 0,
"new_findings": [],
"resolved_findings": []
}
}Fields:
schema_version: string. JSON report schema version for automation consumers.repo: string. The repository path passed to--repo.profile: string. The selected profile, such asstrict,docs,dora-ai-readiness, orpublic-export.decision: string.READYwhen no blocker findings are present, otherwiseBLOCKED.counts: object. Finding totals by level.findings: array. The current finding list after report privacy options are applied.baseline_diff: object, optional. Present only when--baseline-jsonis supplied.
{
"blocker": 0,
"warning": 0,
"info": 0
}Fields:
blocker: integer. Number of blocker findings.warning: integer. Number of warning findings.info: integer. Number of info findings.
{
"level": "blocker",
"code": "missing_process_file",
"path": ".",
"message": "Missing process file: README",
"line": null,
"evidence": null
}Fields:
level: string. One ofblocker,warning, orinfo.code: string. Stable finding code for automation and grouping.path: string. Report path after--path-modeor--paranoidhandling.message: string. Human-readable finding message.line: integer or null, optional for consumers. Present when a finding maps to a specific line.evidence: string or null, optional for consumers. Evidence text may be omitted under privacy options.
Privacy behavior:
--paranoiduses basename-only paths and omits evidence snippets.--no-evidenceomits evidence snippets.--max-evidence-charstruncates evidence snippets.--redact-patternreplaces matching evidence text with[REDACTED].--path-mode basename|hashreduces path detail before the JSON report is written.
When evidence is omitted by privacy options, consumers should treat missing, null, or empty evidence as equivalent to "not included in this report."
When profile is dora-ai-readiness, the report uses the same top-level schema and finding shape as other profiles.
The profile emits one DORA-specific finding for each capability:
- Evidence found:
levelisinfo,codeisdora_<capability>_evidence, and the finding points to the first detected evidence location. - Evidence missing:
levelisblocker,codeismissing_dora_<capability>, and the message describes the missing documentation evidence.
Current capability code names are ai_stance, data_boundary, ai_accessible_context, version_control, small_batches, user_focus, and internal_platform.
For this profile, decision: "READY" means no DORA documentation-evidence blocker was emitted. It is not a certification of DORA maturity, DORA metric performance, security, compliance, correctness, model safety, or production readiness.
baseline_diff is present only when the run includes --baseline-json.
{
"new": 1,
"resolved": 2,
"new_findings": [],
"resolved_findings": []
}Fields:
new: integer. Number of findings present in the current report but absent from the baseline.resolved: integer. Number of findings present in the baseline but absent from the current report.new_findings: array of finding objects. Findings counted bynew.resolved_findings: array of finding objects. Findings counted byresolved.
Baseline matching uses finding content after report privacy options are applied. If privacy settings differ between the baseline and current run, paths or evidence may change enough to affect the diff.
- Treat unknown future fields as additive.
- Use
schema_versionbefore relying on report structure in automation. - Do not treat
READYas proof that a repository is secure, compliant, correct, or ready to ship. - Use
decisionfor coarse gating andcountsplusfindings[*].codefor reporting or dashboards.