When debug=True, Docling Graph writes debug/trace_data.json as a compact, step-oriented payload.
Top-level structure:
{
"summary": {
"runtime_seconds": 1.237,
"page_count": 1,
"extraction_success": true,
"fallback_used": false,
"node_count": 7,
"edge_count": 6
},
"steps": [
{
"name": "pipeline",
"runtime_seconds": 1.237,
"status": "success",
"artifacts": { "...": "..." }
},
{
"name": "docling_conversion",
"runtime_seconds": 0.312,
"status": "success",
"artifacts": { "...": "..." }
}
]
}Each step object includes only:
nameruntime_seconds(duration in seconds, 4 decimal places)statusartifacts(single canonical payload; no mirroredevents)
docling_conversion.artifacts.pagesdata_extraction.artifacts.extractionsdata_extraction.artifacts.fallbacksdata_extraction.artifacts.staged_traces(when extraction_contract="staged")data_extraction.artifacts.delta_trace/ delta debug artifacts (when extraction_contract="delta")graph_mapping.artifacts.graphpipeline.artifacts.start|finish|failure
Look at data_extraction step artifacts for structured-output behavior.
Example payload keys:
structured_attemptedstructured_failedfallback_usedfallback_error_classstructured_primary_attempt_parsed_jsonstructured_primary_attempt_raw
jq '.steps[] | {name, runtime_seconds, status}' debug/trace_data.jsonjq '.steps[] | select(.name == "data_extraction") | .artifacts.fallbacks' debug/trace_data.jsonimport json
from pathlib import Path
data = json.loads(Path("debug/trace_data.json").read_text())
print(data["summary"])
for step in data["steps"]:
print(step["name"], step["runtime_seconds"], step["status"])- Large strings are truncated during JSON export to keep debug files manageable.
trace_data.jsonintentionally exports compact step artifacts only (no mirrored raw events).trace_data.jsonno longer uses legacy buckets likeextractions,intermediate_graphs, orconsolidation.