{
"$defs": {
"AnalysisCompleteness": {
"enum": [
"complete",
"partial",
"unsupported"
],
"type": "string"
},
"BumpSeverity": {
"enum": [
"none",
"patch",
"minor",
"major"
],
"type": "string"
},
"ChangeRecommendation": {
"additionalProperties": false,
"properties": {
"classification_enforced": {
"default": true,
"description": "Whether the changeset policy enforces classified bumps.",
"type": "boolean"
},
"compatibility_impact": {
"$ref": "#/$defs/CompatibilityImpact",
"description": "Compatibility impact measured between the default branch and the\ncandidate. This is what the pull request changed, including any break\nagainst an API the default branch has not released yet."
},
"completeness": {
"$ref": "#/$defs/AnalysisCompleteness"
},
"confidence": {
"$ref": "#/$defs/ClassificationConfidence"
},
"enforceable_minimum": {
"$ref": "#/$defs/BumpSeverity"
},
"finding_ids": {
"items": {
"type": "string"
},
"type": "array"
},
"proposed_changeset_bump": {
"$ref": "#/$defs/BumpSeverity"
},
"pull_request_changes": {
"description": "Whether this contribution touches the package. The net candidate and the\nlocal working tree are pull request evidence; the `release` and\n`releaseToDefault` comparisons describe the default branch and do not set\nthis flag. When false, `proposed_changeset_bump` and\n`enforceable_minimum` are `none` and the accumulated change appears only\nin `release_floor` and `release_impact`.",
"type": "boolean"
},
"release_floor": {
"$ref": "#/$defs/BumpSeverity"
},
"release_impact": {
"anyOf": [
{
"$ref": "#/$defs/CompatibilityImpact"
},
{
"type": "null"
}
],
"description": "Compatibility impact measured between the latest release and the\ncandidate. Absent when no reachable release tag matched the package."
},
"review_required": {
"type": "boolean"
}
},
"required": [
"compatibility_impact",
"pull_request_changes",
"proposed_changeset_bump",
"enforceable_minimum",
"release_floor",
"confidence",
"completeness",
"review_required",
"finding_ids"
],
"type": "object"
},
"ChangesetAction": {
"enum": [
"create",
"update",
"keep",
"review",
"no_changeset"
],
"type": "string"
},
"ClassificationConfidence": {
"enum": [
"low",
"medium",
"high"
],
"type": "string"
},
"ClassificationFinding": {
"additionalProperties": false,
"properties": {
"after": {
"type": [
"string",
"null"
]
},
"analyzer": {
"$ref": "#/$defs/FindingAnalyzer"
},
"before": {
"type": [
"string",
"null"
]
},
"bump": {
"$ref": "#/$defs/BumpSeverity"
},
"change": {
"type": "string"
},
"comparisons": {
"items": {
"$ref": "#/$defs/ComparisonKind"
},
"type": "array",
"uniqueItems": true
},
"confidence": {
"$ref": "#/$defs/ClassificationConfidence"
},
"coverage": {
"$ref": "#/$defs/FindingCoverage"
},
"id": {
"type": "string"
},
"impact": {
"$ref": "#/$defs/CompatibilityImpact"
},
"location": {
"type": "string"
},
"rule_id": {
"type": "string"
},
"summary": {
"type": "string"
},
"surface": {
"type": "string"
}
},
"required": [
"id",
"rule_id",
"surface",
"change",
"impact",
"bump",
"confidence",
"analyzer",
"coverage",
"location",
"comparisons",
"summary"
],
"type": "object"
},
"CliSnapshotStatus": {
"description": "Why a CLI snapshot comparison did or did not produce findings.",
"oneOf": [
{
"const": "diffed",
"description": "Baseline and candidate snapshot were captured and diffed.",
"type": "string"
},
{
"const": "missing_baseline",
"description": "No committed baseline exists for this CLI yet.",
"type": "string"
},
{
"const": "stale_baseline",
"description": "The committed baseline could not be diffed (unparsable or schema mismatch).",
"type": "string"
},
{
"const": "failed",
"description": "The configured snapshot command failed or printed an invalid document.",
"type": "string"
},
{
"const": "skipped",
"description": "CLI snapshot capture was disabled by flag or environment.",
"type": "string"
}
]
},
"ComparisonKind": {
"enum": [
"pull_request",
"release",
"release_to_default",
"source_delta",
"working_tree"
],
"type": "string"
},
"ComparisonStatus": {
"enum": [
"analyzed",
"unavailable",
"conflicted"
],
"type": "string"
},
"CompatibilityImpact": {
"oneOf": [
{
"enum": [
"compatible",
"additive",
"breaking"
],
"type": "string"
},
{
"const": "unmodeled",
"description": "The change is real, but it sits outside the public surface this analyzer\nmodels, so no compatibility verdict applies. The package is supported;\nonly this particular file change is unmodeled.",
"type": "string"
}
]
},
"DetectionLevel": {
"description": "Level of detail requested from semantic analyzers.",
"oneOf": [
{
"const": "basic",
"description": "Fastest mode. Prefer lightweight structural extraction.",
"type": "string"
},
{
"const": "signature",
"description": "Extract before/after signatures when possible.",
"type": "string"
},
{
"const": "semantic",
"description": "Perform the richest semantic extraction available for the ecosystem.",
"type": "string"
}
]
},
"Ecosystem": {
"enum": [
"cargo",
"npm",
"deno",
"dart",
"python",
"go"
],
"type": "string"
},
"ExistingChangeset": {
"additionalProperties": false,
"properties": {
"bump": {
"anyOf": [
{
"$ref": "#/$defs/BumpSeverity"
},
{
"type": "null"
}
]
},
"change_type": {
"type": [
"string",
"null"
]
},
"path": {
"type": "string"
}
},
"required": [
"path"
],
"type": "object"
},
"FindingAnalyzer": {
"additionalProperties": false,
"properties": {
"engine": {
"type": [
"string",
"null"
]
},
"id": {
"type": "string"
},
"version": {
"type": "string"
}
},
"required": [
"id",
"version"
],
"type": "object"
},
"FindingCoverage": {
"additionalProperties": false,
"properties": {
"checks": {
"items": {
"$ref": "#/$defs/SemanticAnalyzerCheck"
},
"type": "array"
},
"completeness": {
"$ref": "#/$defs/AnalysisCompleteness"
},
"detection_level": {
"$ref": "#/$defs/DetectionLevel"
},
"fallback_reason": {
"type": [
"string",
"null"
]
},
"note": {
"type": "string"
}
},
"required": [
"detection_level",
"completeness",
"note"
],
"type": "object"
},
"PackageClassification": {
"additionalProperties": false,
"properties": {
"action": {
"$ref": "#/$defs/ChangesetAction"
},
"cli": {
"anyOf": [
{
"$ref": "#/$defs/PackageCliClassification"
},
{
"type": "null"
}
]
},
"comparisons": {
"items": {
"$ref": "#/$defs/ResolvedComparison"
},
"type": "array"
},
"decision": {
"$ref": "#/$defs/ChangeRecommendation"
},
"ecosystem": {
"$ref": "#/$defs/Ecosystem"
},
"existing_changesets": {
"items": {
"$ref": "#/$defs/ExistingChangeset"
},
"type": "array"
},
"findings": {
"items": {
"$ref": "#/$defs/ClassificationFinding"
},
"type": "array"
},
"package_id": {
"type": "string"
},
"package_name": {
"type": "string"
},
"recommendation": {
"$ref": "#/$defs/BumpSeverity"
},
"release_owner": {
"anyOf": [
{
"$ref": "#/$defs/ReleaseOwner"
},
{
"type": "null"
}
]
},
"summary": {
"type": "string"
},
"warnings": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"package_id",
"package_name",
"ecosystem",
"comparisons",
"recommendation",
"decision",
"summary",
"findings",
"existing_changesets",
"action",
"warnings"
],
"type": "object"
},
"PackageCliClassification": {
"additionalProperties": false,
"description": "Outcome of the CLI command-surface comparison for one package.",
"properties": {
"baseline": {
"type": [
"string",
"null"
]
},
"finding_count": {
"format": "uint",
"minimum": 0,
"type": [
"integer",
"null"
]
},
"name": {
"type": "string"
},
"recommendation": {
"anyOf": [
{
"$ref": "#/$defs/BumpSeverity"
},
{
"type": "null"
}
]
},
"status": {
"$ref": "#/$defs/CliSnapshotStatus"
}
},
"required": [
"name",
"status"
],
"type": "object"
},
"ReleaseOwner": {
"additionalProperties": false,
"properties": {
"id": {
"type": "string"
},
"kind": {
"type": "string"
},
"latest_release": {
"type": [
"string",
"null"
]
}
},
"required": [
"kind",
"id"
],
"type": "object"
},
"ResolvedComparison": {
"additionalProperties": false,
"properties": {
"base": {
"type": [
"string",
"null"
]
},
"head": {
"type": "string"
},
"kind": {
"$ref": "#/$defs/ComparisonKind"
},
"note": {
"type": [
"string",
"null"
]
},
"status": {
"$ref": "#/$defs/ComparisonStatus"
}
},
"required": [
"kind",
"head",
"status"
],
"type": "object"
},
"SemanticAnalysisOutcome": {
"description": "Compatibility outcome proven or inferred by a semantic analyzer.",
"oneOf": [
{
"const": "inconclusive",
"description": "The analyzer could not reach a conclusive compatibility result.",
"type": "string"
},
{
"const": "compatible",
"description": "The public contract remains compatible.",
"type": "string"
},
{
"const": "additive",
"description": "The public contract gained compatible capability.",
"type": "string"
},
{
"const": "breaking",
"description": "The public contract is incompatible with existing consumers.",
"type": "string"
}
]
},
"SemanticAnalyzerCheck": {
"additionalProperties": false,
"description": "Machine-readable result for one scope within an analyzer run.",
"properties": {
"configuration": {
"additionalProperties": {
"type": "string"
},
"description": "Exact analyzer-specific inputs used for this check.",
"type": "object"
},
"diagnostics": {
"description": "Stable diagnostics that explain the result.",
"items": {
"$ref": "#/$defs/SemanticAnalyzerDiagnostic"
},
"type": "array"
},
"name": {
"description": "Stable check name, such as a feature/target matrix cell id.",
"type": "string"
},
"outcome": {
"anyOf": [
{
"$ref": "#/$defs/SemanticAnalysisOutcome"
},
{
"type": "null"
}
],
"description": "Compatibility outcome for a completed check."
},
"status": {
"$ref": "#/$defs/SemanticAnalyzerCheckStatus",
"description": "Whether the check completed, was skipped, or failed."
},
"suggested_bump": {
"anyOf": [
{
"$ref": "#/$defs/BumpSeverity"
},
{
"type": "null"
}
],
"description": "Minimum release bump reported by a completed check."
}
},
"required": [
"name",
"status"
],
"type": "object"
},
"SemanticAnalyzerCheckStatus": {
"description": "Completion state for one analyzer sub-check.",
"oneOf": [
{
"const": "checked",
"description": "The analyzer completed and returned a compatibility outcome.",
"type": "string"
},
{
"const": "skipped",
"description": "The analyzer deliberately skipped this scope because a prerequisite was unavailable.",
"type": "string"
},
{
"const": "failed",
"description": "The analyzer attempted this scope but did not produce trustworthy evidence.",
"type": "string"
}
]
},
"SemanticAnalyzerDiagnostic": {
"additionalProperties": false,
"description": "One stable diagnostic emitted by a semantic analyzer sub-check.",
"properties": {
"code": {
"description": "Stable tool-specific diagnostic code.",
"type": "string"
},
"message": {
"description": "Human-readable diagnostic title or summary.",
"type": "string"
},
"reference": {
"description": "Authoritative reference for the diagnostic, when available.",
"type": [
"string",
"null"
]
}
},
"required": [
"code",
"message"
],
"type": "object"
}
},
"$id": "https://monochange.github.io/monochange/schemas/classification.schema.json",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"description": "JSON Schema for monochange.toml workspace configuration files.",
"properties": {
"candidate": {
"type": "string"
},
"comparisons": {
"items": {
"$ref": "#/$defs/ResolvedComparison"
},
"type": "array"
},
"default_branch": {
"type": "string"
},
"matched_skip_labels": {
"description": "Configured skip labels that matched labels on this pull request.",
"items": {
"type": "string"
},
"type": "array"
},
"packages": {
"items": {
"$ref": "#/$defs/PackageClassification"
},
"type": "array"
},
"recommendation": {
"$ref": "#/$defs/BumpSeverity"
},
"schema_version": {
"type": "string"
},
"skipped": {
"description": "Whether classification was skipped before any package analysis ran.",
"type": "boolean"
},
"summary": {
"type": "string"
},
"warnings": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"schema_version",
"default_branch",
"candidate",
"comparisons",
"recommendation",
"packages",
"warnings",
"skipped"
],
"title": "monochange classification report",
"type": "object"
}