Report JSON¶
schema_version is 16. It moves when this shape moves,
which is the field to branch on when reading a report programmatically.
The same shape reaches you from report.to_dict() in Python and from
complydoc audit --print-json on the command line.
{
"schema_version": 16,
"top_level_keys": [
"run",
"documents",
"skipped",
"cost",
"aggregate",
"overall",
"quick_wins",
"loader",
"loader_comparison",
"routing",
"verification",
"limitations",
"staleness_warnings",
"signal_weights",
"config_masking"
],
"run": {
"components_run": "list of cost | readiness | sensitive",
"offline_guard": "armed | not_armed",
"content_sent_to": "hosts sent document text or page images, empty unless a hosted classifier or a vision model ran",
"verify_model": "the vision reader pages were checked against, null unless --verify",
"verify_scope": "flagged | all, null unless --verify",
"classifier_missed_workers": "documents a registered classifier could not reach",
"classifier_calls": "calls a registered classifier made, 0 unless one ran",
"classifier_failures": "of those, calls that raised and so produced no score",
"reveal_used": "bool \u2014 true means values are NOT masked",
"page_images_used": "bool",
"extracted_text_used": "bool",
"report_detail": "summary | full \u2014 summary leaves out documents[].cost.models, documents[].previews and cost.documents; full writes every field",
"jobs": "worker processes used",
"timeout_seconds": "seconds each document was given, when --timeout was used",
"documents_read_after_worker_failure": "documents re-read after a worker stopped",
"config_digest": "identifies the config that produced these numbers"
},
"documents[]": {
"relative_path": "str",
"sha256": "str",
"format": "pdf | image | docx | xlsx | pptx | html | markdown | text | email | other",
"cost": "pages, page_count, text layer and coverage for this document",
"cost.models[]": "full only: every priced model against this document, with text and vision token counts and USD",
"previews[]": "full only: page geometry the HTML report draws its page views from",
"readiness.signals[]": "id, value, rating, weight, why, status",
"readiness.score": "value 0-100, higher is better; label; low_confidence",
"sensitive.matches[]": "category, page, line, column, masked, severity, and evidence: confirmed | corroborated | pattern | model",
"sensitive.unreadable_pages": "pages that were not searched at all",
"sensitive.models_used": "category -> the detector and model that answered for it, where a model rather than a pattern read it",
"extractions[]": "one per reader asked for; the first is the one kept",
"extracted_text[].costs": "reader -> usd, basis (local | actual | estimated | unpriced), model, input_tokens, output_tokens: what each reading of the page cost",
"extracted_text[].seconds": "reader -> seconds it took on this page, where timed",
"extracted_text[].tokens": "reader -> tokenizer -> text tokens in that reading of the page",
"extracted_text[].image_tokens": "vision formula -> image tokens for the page",
"extracted_text[].vision_estimate": "what the cheapest priced vision model would cost for this page, estimated",
"verification": "null unless --verify: model, scope, pages[] (number, status: agrees | disagrees | filled | failed | not_rendered, why, similarity, coverage, missing, cost), unreadable_pages[], sent_to[]",
"metadata_findings[]": "key, category, severity, evidence, masked (from metadata)",
"content_findings[]": "page, visibility (visible | not_measured | suspected | confirmed), instruction (confirmed | pattern | model | none), severity, excerpt, hidden_reasons[], instruction_reasons[], score, in_loader_output",
"visibility_checked": "bool, null when the scan did not run",
"path_exposures": "metadata keys holding an absolute filesystem path"
},
"cost": "null unless cost ran: currency, headline_resolution, resolutions[], volume, models[] (the folder's cost per model and per path: text_layer, text_ocr, vision, each with folder_usd, per_1000_usd and annual_usd; and the model's input_per_mtok_usd, supports_vision, vision_formula and tokenizer, to price one page), and, full only, documents[] (every document against every model)",
"overall": {
"score": "global readiness 0-100, content and cost path and exposure",
"factors[]": "name, score (null when not measured), weight, why",
"bands": "documents per band \u2014 the composition the mean hides"
},
"quick_wins[]": "id, title, detail, documents[], actor (complydoc | you), effect",
"loader": "null unless documents came from an external loader: name, documents_returned, seconds, network_allowed, network_attempts[], error, tags[], metadata_keys[]",
"loader_comparison": "null unless compare_loaders ran: baseline, loaders[] (per-loader totals, network, scores, failures, facts_found, parser_usd, tags[]), facts[] (found, scores, and nearest: the passage that came closest where a fact was missed), identifier_differences[] (found_by[], missed_by[]), metadata_keys (key -> loaders returning it), documents (path -> loaders), recommended (the loader to use, null where the run cannot tell), verdict (what decided it), ranked[]",
"aggregate": "folder totals: cost, signal_distribution, sensitive_by_category, content_matrix (instruction -> visibility -> passages)",
"verification": "null unless --verify: model, scope, min_coverage, pages_total, pages_checked, pages_agree, pages_disagree, pages_filled, pages_failed, pages_unreadable, usd, usd_basis, headline",
"limitations[]": "area, statement, affected[], severity (info | important)"
}