Skip to main content
Submit one finding per root cause, as JSON on stdin:
The canonical schema is schemas/finding-submission.schema.json. The CLI assigns the finding id, computes the deduplication fingerprint, redacts secret-shaped material, normalizes the category, and records verification state.
additionalProperties is false. Any extra top-level field — including id — is a rejection, not a warning.

Required fields

affected

route and file feed the deduplication fingerprint after normalization, so /orders/12 and /orders/13 collapse to one location.

evidence[]

Optional fields

Rejection and adjustment rules

Rejections — the submission is not stored, and exit code is 2:
  • any extra top-level field, including id;
  • a secret value anywhere in the payload that survives redaction;
  • missing evidence;
  • any schema constraint above.
Adjustments — the finding is stored, with a warning explaining what changed:
  • severity: "critical" with verification: "needs_review" becomes high, because an unvalidated finding is a lead;
  • missing_security_header, verbose_error_message, and outdated_dependency_no_known_exploit_path are capped at medium unless at least one piece of evidence has kind runtime or identity_differential.
Evidence that only restates the category is a quality failure the report will show, even when it passes the schema.

The submission result

Submitting the same root cause again with new evidence is not a duplicate — it becomes corroboration on the original finding.

Worked example

Every schema in schemas/ is language-neutral JSON Schema, and packages/contracts generates its runtime validators from them — so a drift between the schema and the validator is a lint failure, not a surprise at runtime.