{
  "run_at": "2026-05-02T12:55:34+00:00",
  "db_path": "/opt/caselaw/repo/output/decisions.db",
  "duration_seconds": 53.85,
  "summary": {
    "total": 52,
    "passed": 52,
    "critical_failures": 0,
    "warning_failures": 0,
    "publish_safe": true
  },
  "results": [
    {
      "name": "urls.no_relative_source_urls",
      "severity": "critical",
      "passed": true,
      "metric_value": 0,
      "threshold": 0,
      "message": "all source_urls are absolute",
      "sample_rows": [],
      "fix_advice": "scraper must prefix host. See scrapers/entscheidsuche_ingest.py for the GL/BS pattern.",
      "court": null,
      "extra": {}
    },
    {
      "name": "structure.sidecar_exists",
      "severity": "critical",
      "passed": true,
      "metric_value": 1,
      "threshold": 1,
      "message": "sidecar at output/decision_structure.db (present)",
      "sample_rows": [],
      "fix_advice": "run search_stack/extract_decision_structure.py",
      "court": null,
      "extra": {}
    },
    {
      "name": "schema.required_not_null.decision_id",
      "severity": "critical",
      "passed": true,
      "metric_value": 0,
      "threshold": 0,
      "message": "all rows have non-null decision_id",
      "sample_rows": [],
      "fix_advice": "investigate ingestion path; required columns must be set by every scraper",
      "court": null,
      "extra": {}
    },
    {
      "name": "schema.required_not_null.court",
      "severity": "critical",
      "passed": true,
      "metric_value": 0,
      "threshold": 0,
      "message": "all rows have non-null court",
      "sample_rows": [],
      "fix_advice": "investigate ingestion path; required columns must be set by every scraper",
      "court": null,
      "extra": {}
    },
    {
      "name": "schema.decisions_table_exists",
      "severity": "critical",
      "passed": true,
      "metric_value": 1,
      "threshold": 1,
      "message": "decisions table present",
      "sample_rows": [],
      "fix_advice": "rebuild output/decisions.db via build_fts5.py",
      "court": null,
      "extra": {}
    },
    {
      "name": "schema.decisions_fts_exists",
      "severity": "critical",
      "passed": true,
      "metric_value": 1,
      "threshold": 1,
      "message": "FTS5 virtual table present",
      "sample_rows": [],
      "fix_advice": "rebuild output/decisions.db via build_fts5.py",
      "court": null,
      "extra": {}
    },
    {
      "name": "schema.decision_id_uniqueness",
      "severity": "critical",
      "passed": true,
      "metric_value": 0,
      "threshold": 0,
      "message": "all decision_ids unique",
      "sample_rows": [],
      "fix_advice": "check INSERT OR IGNORE / INSERT OR REPLACE in scrapers and build_fts5.merge_shards",
      "court": null,
      "extra": {
        "total": 971067,
        "distinct": 971067
      }
    },
    {
      "name": "schema.corpus_total_count",
      "severity": "critical",
      "passed": true,
      "metric_value": 971067,
      "threshold": 950000,
      "message": "corpus total: 971,067",
      "sample_rows": [],
      "fix_advice": "check publish.py Step 2 build_fts5 logs; verify .tmp swap completed atomically",
      "court": null,
      "extra": {}
    },
    {
      "name": "mcp_tools.search_fts_returns_hits",
      "severity": "critical",
      "passed": true,
      "metric_value": 365958,
      "threshold": 100,
      "message": "FTS5 'Beschwerde' query: 365,958 hits",
      "sample_rows": [],
      "fix_advice": "if 0, FTS5 build never indexed; rerun build_fts5",
      "court": null,
      "extra": {}
    },
    {
      "name": "mcp_tools.get_decision_by_id",
      "severity": "critical",
      "passed": true,
      "metric_value": 1,
      "threshold": 1,
      "message": "get_decision_by_id(bge_BGE_140_III_86): ok",
      "sample_rows": [],
      "fix_advice": null,
      "court": null,
      "extra": {}
    },
    {
      "name": "mcp_tools.e_number_sort_key_helper",
      "severity": "critical",
      "passed": true,
      "metric_value": 1,
      "threshold": 1,
      "message": "e_number_sort: ok (2.10 > 2.2 etc.)",
      "sample_rows": [],
      "fix_advice": null,
      "court": null,
      "extra": {}
    },
    {
      "name": "mcp_tools.decision_id_variants_helper",
      "severity": "critical",
      "passed": true,
      "metric_value": 2,
      "threshold": 2,
      "message": "_decision_id_variants: 2/2 cases",
      "sample_rows": [],
      "fix_advice": null,
      "court": null,
      "extra": {}
    },
    {
      "name": "languages.unexpected_values",
      "severity": "critical",
      "passed": true,
      "metric_value": 0,
      "threshold": 0,
      "message": "all language codes ∈ {de, fr, it, rm}",
      "sample_rows": [],
      "fix_advice": "language must be a 2-letter ISO code. Investigate the scraper that wrote this row's language column.",
      "court": null,
      "extra": {
        "distribution": {
          "de": 449361,
          "fr": 441018,
          "it": 80688
        }
      }
    },
    {
      "name": "languages.distribution_plausible",
      "severity": "critical",
      "passed": true,
      "metric_value": 46.274973817460584,
      "threshold": 30.0,
      "message": "DE 46.3% / FR 45.4% / IT 8.3% / RM 0.00%",
      "sample_rows": [],
      "fix_advice": "DE and FR each need ≥30%, IT ≥3%; under-floor means a language-block of scrapers crashed in publish.py Step 1",
      "court": null,
      "extra": {
        "de": 449361,
        "fr": 441018,
        "it": 80688
      }
    },
    {
      "name": "exports.ris_render",
      "severity": "critical",
      "passed": true,
      "metric_value": 25,
      "threshold": 25,
      "message": "ris: 25/25 sample renders ok",
      "sample_rows": [],
      "fix_advice": null,
      "court": null,
      "extra": {}
    },
    {
      "name": "exports.bibtex_render",
      "severity": "critical",
      "passed": true,
      "metric_value": 25,
      "threshold": 25,
      "message": "bibtex: 25/25 sample renders ok",
      "sample_rows": [],
      "fix_advice": null,
      "court": null,
      "extra": {}
    },
    {
      "name": "duplicates.egmr_dual_attribution",
      "severity": "critical",
      "passed": true,
      "metric_value": 0,
      "threshold": 0,
      "message": "EGMR attribution clean",
      "sample_rows": [],
      "fix_advice": "codified by build_fts5._dedup_egmr_in_bge() + scrapers/entscheidsuche_ingest.py override",
      "court": null,
      "extra": {}
    },
    {
      "name": "duplicates.decision_id_cross_court",
      "severity": "critical",
      "passed": true,
      "metric_value": 0,
      "threshold": 0,
      "message": "all decision_ids have a single court attribution",
      "sample_rows": [],
      "fix_advice": null,
      "court": null,
      "extra": {}
    },
    {
      "name": "dockets.whitespace",
      "severity": "critical",
      "passed": true,
      "metric_value": 0,
      "threshold": 0,
      "message": "all dockets are trimmed",
      "sample_rows": [],
      "fix_advice": "build_fts5._normalize_dockets() auto-trims; verify it ran",
      "court": null,
      "extra": {}
    },
    {
      "name": "dockets.internal_newlines",
      "severity": "critical",
      "passed": true,
      "metric_value": 0,
      "threshold": 0,
      "message": "no embedded newlines",
      "sample_rows": [],
      "fix_advice": "check scraper that wrote these rows; replace newline with space",
      "court": null,
      "extra": {}
    },
    {
      "name": "dates.year_0000",
      "severity": "critical",
      "passed": true,
      "metric_value": 0,
      "threshold": 0,
      "message": "no year-0000 placeholder dates",
      "sample_rows": [],
      "fix_advice": "build_fts5._normalize_dates() auto-converts to NULL; verify it ran on this build",
      "court": null,
      "extra": {}
    },
    {
      "name": "dates.pre_1700",
      "severity": "critical",
      "passed": true,
      "metric_value": 0,
      "threshold": 0,
      "message": "no pre-1700 dates",
      "sample_rows": [],
      "fix_advice": null,
      "court": null,
      "extra": {}
    },
    {
      "name": "dates.invalid_format",
      "severity": "critical",
      "passed": true,
      "metric_value": 0,
      "threshold": 0,
      "message": "all dates are ISO 8601 format",
      "sample_rows": [],
      "fix_advice": null,
      "court": null,
      "extra": {}
    },
    {
      "name": "dates.future_window",
      "severity": "critical",
      "passed": true,
      "metric_value": 1,
      "threshold": 50,
      "message": "1 future-dated rows (within tolerance)",
      "sample_rows": [
        {
          "decision_id": "sz_gerichte_STK 2025 37",
          "court": "sz_gerichte",
          "decision_date": "2026-06-03"
        }
      ],
      "fix_advice": "if >50, expect a scraper date-parsing regression",
      "court": null,
      "extra": {}
    },
    {
      "name": "dates.far_future",
      "severity": "critical",
      "passed": true,
      "metric_value": 0,
      "threshold": 0,
      "message": "no far-future dates",
      "sample_rows": [],
      "fix_advice": "build_fts5._normalize_dates() auto-NULLs these; check scraper date-parsing for German/French month confusion",
      "court": null,
      "extra": {}
    },
    {
      "name": "cross_db.sidecar_present.statutes",
      "severity": "critical",
      "passed": true,
      "metric_value": 1,
      "threshold": 1,
      "message": "statutes at output/statutes.db (present)",
      "sample_rows": [],
      "fix_advice": "rebuild via search_stack/build_statutes_db.py or scripts/extract_*.py",
      "court": null,
      "extra": {}
    },
    {
      "name": "cross_db.sidecar_present.reference_graph",
      "severity": "critical",
      "passed": true,
      "metric_value": 1,
      "threshold": 1,
      "message": "reference_graph at output/reference_graph.db (present)",
      "sample_rows": [],
      "fix_advice": "rebuild via search_stack/build_reference_graph_db.py or scripts/extract_*.py",
      "court": null,
      "extra": {}
    },
    {
      "name": "cross_db.sidecar_present.ok_commentaries",
      "severity": "critical",
      "passed": true,
      "metric_value": 1,
      "threshold": 1,
      "message": "ok_commentaries at output/ok_commentaries.db (present)",
      "sample_rows": [],
      "fix_advice": "rebuild via search_stack/build_ok_commentaries_db.py or scripts/extract_*.py",
      "court": null,
      "extra": {}
    },
    {
      "name": "cross_db.sidecar_present.decision_structure",
      "severity": "critical",
      "passed": true,
      "metric_value": 1,
      "threshold": 1,
      "message": "decision_structure at output/decision_structure.db (present)",
      "sample_rows": [],
      "fix_advice": "rebuild via search_stack/build_decision_structure_db.py or scripts/extract_*.py",
      "court": null,
      "extra": {}
    },
    {
      "name": "cross_db.sidecar_present.cantonal_laws",
      "severity": "critical",
      "passed": true,
      "metric_value": 1,
      "threshold": 1,
      "message": "cantonal_laws at output/cantonal_laws.db (present)",
      "sample_rows": [],
      "fix_advice": "rebuild via search_stack/build_cantonal_laws_db.py or scripts/extract_*.py",
      "court": null,
      "extra": {}
    },
    {
      "name": "courts.null_court",
      "severity": "critical",
      "passed": true,
      "metric_value": 0,
      "threshold": 0,
      "message": "every row has a court",
      "sample_rows": [],
      "fix_advice": null,
      "court": null,
      "extra": {}
    },
    {
      "name": "courts.federal_present.weko",
      "severity": "critical",
      "passed": true,
      "metric_value": 256,
      "threshold": 1,
      "message": "weko: 256 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "weko",
      "extra": {}
    },
    {
      "name": "courts.federal_present.ubi",
      "severity": "critical",
      "passed": true,
      "metric_value": 652,
      "threshold": 1,
      "message": "ubi: 652 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "ubi",
      "extra": {}
    },
    {
      "name": "courts.federal_present.ta_sst",
      "severity": "critical",
      "passed": true,
      "metric_value": 49,
      "threshold": 1,
      "message": "ta_sst: 49 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "ta_sst",
      "extra": {}
    },
    {
      "name": "courts.federal_present.postcom",
      "severity": "critical",
      "passed": true,
      "metric_value": 216,
      "threshold": 1,
      "message": "postcom: 216 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "postcom",
      "extra": {}
    },
    {
      "name": "courts.federal_present.mkg",
      "severity": "critical",
      "passed": true,
      "metric_value": 1244,
      "threshold": 1,
      "message": "mkg: 1,244 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "mkg",
      "extra": {}
    },
    {
      "name": "courts.federal_present.hudoc_ch",
      "severity": "critical",
      "passed": true,
      "metric_value": 835,
      "threshold": 1,
      "message": "hudoc_ch: 835 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "hudoc_ch",
      "extra": {}
    },
    {
      "name": "courts.federal_present.finma_versicherungsrecht",
      "severity": "critical",
      "passed": true,
      "metric_value": 2582,
      "threshold": 1,
      "message": "finma_versicherungsrecht: 2,582 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "finma_versicherungsrecht",
      "extra": {}
    },
    {
      "name": "courts.federal_present.finma",
      "severity": "critical",
      "passed": true,
      "metric_value": 455,
      "threshold": 1,
      "message": "finma: 455 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "finma",
      "extra": {}
    },
    {
      "name": "courts.federal_present.emark",
      "severity": "critical",
      "passed": true,
      "metric_value": 237,
      "threshold": 1,
      "message": "emark: 237 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "emark",
      "extra": {}
    },
    {
      "name": "courts.federal_present.elcom",
      "severity": "critical",
      "passed": true,
      "metric_value": 424,
      "threshold": 1,
      "message": "elcom: 424 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "elcom",
      "extra": {}
    },
    {
      "name": "courts.federal_present.edoeb",
      "severity": "critical",
      "passed": true,
      "metric_value": 1803,
      "threshold": 1,
      "message": "edoeb: 1,803 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "edoeb",
      "extra": {}
    },
    {
      "name": "courts.federal_present.comcom",
      "severity": "critical",
      "passed": true,
      "metric_value": 64,
      "threshold": 1,
      "message": "comcom: 64 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "comcom",
      "extra": {}
    },
    {
      "name": "courts.federal_present.ch_vb",
      "severity": "critical",
      "passed": true,
      "metric_value": 22884,
      "threshold": 1,
      "message": "ch_vb: 22,884 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "ch_vb",
      "extra": {}
    },
    {
      "name": "courts.federal_present.ch_bundesrat",
      "severity": "critical",
      "passed": true,
      "metric_value": 24,
      "threshold": 1,
      "message": "ch_bundesrat: 24 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "ch_bundesrat",
      "extra": {}
    },
    {
      "name": "courts.federal_present.bvger",
      "severity": "critical",
      "passed": true,
      "metric_value": 92197,
      "threshold": 1,
      "message": "bvger: 92,197 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "bvger",
      "extra": {}
    },
    {
      "name": "courts.federal_present.bstger",
      "severity": "critical",
      "passed": true,
      "metric_value": 11432,
      "threshold": 1,
      "message": "bstger: 11,432 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "bstger",
      "extra": {}
    },
    {
      "name": "courts.federal_present.bpatger",
      "severity": "critical",
      "passed": true,
      "metric_value": 189,
      "threshold": 1,
      "message": "bpatger: 189 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "bpatger",
      "extra": {}
    },
    {
      "name": "courts.federal_present.bger",
      "severity": "critical",
      "passed": true,
      "metric_value": 175252,
      "threshold": 1,
      "message": "bger: 175,252 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "bger",
      "extra": {}
    },
    {
      "name": "courts.federal_present.bge_egmr",
      "severity": "critical",
      "passed": true,
      "metric_value": 477,
      "threshold": 1,
      "message": "bge_egmr: 477 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "bge_egmr",
      "extra": {}
    },
    {
      "name": "courts.federal_present.bge",
      "severity": "critical",
      "passed": true,
      "metric_value": 35345,
      "threshold": 1,
      "message": "bge: 35,345 decisions",
      "sample_rows": [],
      "fix_advice": null,
      "court": "bge",
      "extra": {}
    },
    {
      "name": "courts.canonical_format",
      "severity": "critical",
      "passed": true,
      "metric_value": 0,
      "threshold": 0,
      "message": "all 108 court codes look canonical",
      "sample_rows": [],
      "fix_advice": "court ids must match `[a-z][a-z0-9_]*`. Investigate the scraper writing this row's court value.",
      "court": null,
      "extra": {
        "distinct_courts": 108
      }
    }
  ]
}