{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://drunkonjava.github.io/rvt-rs/schemas/export-diagnostics.schema.json",
"title": "rvt IFC export diagnostics JSON",
"description": "Stable diagnostics sidecar emitted by rvt-ifc --diagnostics and Python export diagnostics helpers.",
"type": "object",
"required": [
"schema_version",
"mode",
"input",
"decoded",
"exported",
"skipped",
"unsupported_features",
"warnings",
"confidence"
],
"properties": {
"schema_version": {
"type": "integer",
"minimum": 1
},
"mode": {
"type": "string",
"enum": [
"placeholder",
"default",
"diagnostic_proxies"
]
},
"input": {
"type": "object",
"required": [
"revit_version",
"build",
"original_path",
"project_name",
"stream_count",
"has_basic_file_info",
"has_part_atom",
"has_formats_latest",
"has_global_latest"
],
"properties": {
"revit_version": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"build": {
"type": [
"string",
"null"
]
},
"original_path": {
"type": [
"string",
"null"
]
},
"project_name": {
"type": [
"string",
"null"
]
},
"stream_count": {
"type": "integer",
"minimum": 0
},
"has_basic_file_info": {
"type": "boolean"
},
"has_part_atom": {
"type": "boolean"
},
"has_formats_latest": {
"type": "boolean"
},
"has_global_latest": {
"type": "boolean"
}
}
},
"decoded": {
"type": "object",
"required": [
"production_walker_elements",
"diagnostic_proxy_candidates",
"arcwall_records",
"class_counts"
],
"properties": {
"production_walker_elements": {
"type": "integer",
"minimum": 0
},
"diagnostic_proxy_candidates": {
"type": "integer",
"minimum": 0
},
"arcwall_records": {
"type": "integer",
"minimum": 0
},
"class_counts": {
"type": "object",
"additionalProperties": {
"type": "integer",
"minimum": 0
}
},
"mean_element_confidence": {
"type": ["number", "null"],
"minimum": 0,
"maximum": 1,
"description": "Mean provenance confidence across production iter_elements (M3-07)."
},
"elements_below_min_confidence": {
"type": "integer",
"minimum": 0,
"description": "Count of production elements below min_element_confidence."
},
"min_element_confidence": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Floor used for below-min count and default IFC hide (0.55)."
},
"recovered_unit_identifiers": {
"type": "array",
"description": "Best-effort project unit identifiers selected from Revit autodesk.unit.* records and threaded into IfcUnitAssignment.",
"items": {
"type": "string"
}
},
"unknown_unit_identifiers": {
"type": "array",
"description": "Observed autodesk.unit.* identifiers that did not map to a known IFC unit emission.",
"items": {
"type": "string"
}
}
}
},
"exported": {
"type": "object",
"required": [
"total_entities",
"building_elements",
"building_elements_with_geometry",
"by_ifc_type",
"classification_count",
"unit_assignment_count",
"material_count",
"storey_count"
],
"properties": {
"total_entities": {
"type": "integer",
"minimum": 0
},
"building_elements": {
"type": "integer",
"minimum": 0
},
"building_elements_with_geometry": {
"type": "integer",
"minimum": 0
},
"building_elements_carried_by_parts": {
"type": "integer",
"minimum": 0,
"description": "Building elements with no body of their own because their aggregated parts carry it (stairs, curtain walls); not counted in building_elements_with_geometry."
},
"by_ifc_type": {
"type": "object",
"additionalProperties": {
"type": "integer",
"minimum": 0
}
},
"classification_count": {
"type": "integer",
"minimum": 0
},
"unit_assignment_count": {
"type": "integer",
"minimum": 0
},
"material_count": {
"type": "integer",
"minimum": 0
},
"storey_count": {
"type": "integer",
"minimum": 0
},
"storey_names": {
"type": "array",
"items": {
"type": "string"
},
"description": "Recovered IfcBuildingStorey display names in elevation/name order."
},
"material_names_sample": {
"type": "array",
"items": {
"type": "string"
},
"description": "Capped sample of recovered IfcMaterial display names for File Status."
},
"layered_element_count": {
"type": "integer",
"minimum": 0,
"description": "Elements whose compound layers and layer colours were decoded (RE-53); the glTF export draws each in its layers where they add up to its body's thickness."
},
"body_sources": {
"type": "object",
"additionalProperties": {
"type": "integer",
"minimum": 0
},
"description": "Exported bodies by how they were derived: each record-backed element's BodySource (#409)."
},
"bounding_box_bodies": {
"type": "integer",
"minimum": 0,
"description": "Bodies that are only the element record's bounding box, with no recovered plan profile: placed and sized correctly, not the element's shape (#409)."
}
}
},
"skipped": {
"type": "array",
"items": {
"type": "object",
"required": [
"reason",
"count",
"classes",
"sample_names"
],
"properties": {
"reason": {
"type": "string",
"description": "Machine-readable reason, including unsupported_geometry_* buckets for incomplete element geometry and element_record_without_element_id for element records with no attributable ElementId (RE-30), element_record_without_volume for placed instances with no 3D body, left out as Revit's export leaves them out (#309), and element_record_in_non_primary_design_option for placed instances in a design option other than their set's primary one, also left out as Revit's export leaves them out (RE-40), and element_record_empty_curtain_panel for curtain panels of the Empty System Panel family, left out as Revit's export leaves them out (#309)."
},
"count": {
"type": "integer",
"minimum": 0
},
"classes": {
"type": "object",
"additionalProperties": {
"type": "integer",
"minimum": 0
}
},
"sample_names": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"unsupported_features": {
"type": "array",
"items": {
"type": "string"
}
},
"warnings": {
"type": "array",
"items": {
"type": "string"
}
},
"confidence": {
"type": "object",
"required": [
"level",
"score",
"has_project_metadata",
"has_typed_elements",
"has_geometry",
"has_diagnostic_proxies",
"warning_count"
],
"properties": {
"level": {
"type": "string",
"enum": [
"scaffold",
"typed_no_geometry",
"geometry",
"diagnostic_partial",
"proxy_only"
]
},
"score": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"has_project_metadata": {
"type": "boolean"
},
"has_typed_elements": {
"type": "boolean"
},
"has_geometry": {
"type": "boolean"
},
"has_diagnostic_proxies": {
"type": "boolean"
},
"warning_count": {
"type": "integer",
"minimum": 0
},
"unexported_element_records": {
"type": "integer",
"minimum": 0,
"description": "Element records of a recovered category found but not exported because no ElementId is attributable (element_record_without_element_id, RE-30). Non-zero means the model is incomplete and score is scaled by the exported share; zero is not a completeness claim."
}
}
},
"source_coverage": {
"description": "A10 measured export source-coverage. status=measured when at least one fraction has a trustworthy denominator; status=unset when none can be computed. Fractions stay null when unknown — never invent ratios.",
"type": [
"object",
"null"
],
"required": [
"status"
],
"properties": {
"status": {
"type": "string",
"enum": [
"unset",
"unknown",
"measured"
]
},
"notes": {
"type": "string"
},
"decoded_element_fraction": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1,
"description": "production_walker_elements / the distinct non-zero ElementIds Global/ElemTable declares, when 0 < walker <= that count; null when the table is missing, empty, or exceeded."
},
"exported_element_fraction": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1,
"description": "building_elements / production_walker_elements when walker > 0; null otherwise. Includes non-building production classes (Level/Material) in the denominator."
},
"geometry_element_fraction": {
"type": [
"number",
"null"
],
"minimum": 0,
"maximum": 1,
"description": "building_elements_with_geometry / building_elements when building_elements > 0; null otherwise."
}
}
},
"formats_latest_integrity": {
"description": "Formats/Latest page-boundary integrity under the Finding 1 narrow gate (strip stays disabled). Additive A2/PARSE-001 field.",
"type": [
"object",
"null"
],
"required": [
"stream",
"stored_bytes",
"page_boundary_detected",
"checksum_tail_stripping",
"integrity_status"
],
"properties": {
"stream": {
"type": "string",
"const": "Formats/Latest"
},
"stored_bytes": {
"type": "integer",
"minimum": 0
},
"inflated_bytes": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"page_boundary_detected": {
"type": "boolean"
},
"checksum_tail_stripping": {
"type": "string",
"enum": [
"disabled",
"enabled"
]
},
"integrity_status": {
"type": "string",
"enum": [
"ok",
"uncertain",
"incomplete"
]
},
"diagnostic_code": {
"type": [
"string",
"null"
],
"description": "RVT_FORMATS_MULTIPAGE_UNVERIFIED when multipage completeness is unverified."
},
"schema_scan_truncated": {
"type": "boolean",
"description": "true when the inflated stream exceeds the 65536-byte schema scan limit, so schema parsing stopped before the end of the stream. A \"we stopped looking\" signal; it does not claim the unscanned tail is parseable schema."
},
"schema_scanned_bytes": {
"type": [
"integer",
"null"
],
"minimum": 0,
"description": "Bytes schema parsing would scan: min(inflated_bytes, 65536), or null when inflate failed."
}
}
}
}
}