{
  "product": "Verdikt",
  "run": {
    "junit_timestamp": "2026-10-18T12:20:22.114056-04:00",
    "generated_at": "2026-10-18T16:43:39.487034+00:00",
    "duration_seconds": 518.2,
    "commit": "198fb3a",
    "framework": "pytest",
    "python": "3.14",
    "environment": "windows host, disposable postgres/redis/minio containers"
  },
  "totals": {
    "tests": 934,
    "failed": 0,
    "errored": 0,
    "skipped": 6,
    "duration_seconds": 518.2,
    "passed": 928
  },
  "suites": [
    {
      "id": "auth",
      "name": "Auth & session",
      "description": "Login, CSRF, session cookies, rate limits, DB-backed admins.",
      "totals": {
        "tests": 66,
        "passed": 66,
        "failed": 0,
        "errored": 0,
        "skipped": 0,
        "duration": 251.23
      },
      "files": [
        {
          "file": "test_admin_login",
          "tests": 22,
          "passed": 22,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 25.2
        },
        {
          "file": "test_auth",
          "tests": 10,
          "passed": 10,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 4.23
        },
        {
          "file": "test_csrf",
          "tests": 7,
          "passed": 7,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 5.55
        },
        {
          "file": "test_login_ratelimit",
          "tests": 6,
          "passed": 6,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 179.67
        },
        {
          "file": "test_rbac",
          "tests": 9,
          "passed": 9,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 15.22
        },
        {
          "file": "test_security_headers",
          "tests": 12,
          "passed": 12,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 21.35
        }
      ]
    },
    {
      "id": "pipeline",
      "name": "PAP pipeline",
      "description": "Intake, Triage, extraction, MDM lookup, retrieval, reasoning, orchestration, 3-level model config resolver.",
      "totals": {
        "tests": 188,
        "passed": 188,
        "failed": 0,
        "errored": 0,
        "skipped": 0,
        "duration": 11.31
      },
      "files": [
        {
          "file": "test_pap_extract",
          "tests": 14,
          "passed": 14,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 1.59
        },
        {
          "file": "test_pap_reason",
          "tests": 7,
          "passed": 7,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.82
        },
        {
          "file": "test_pap_retrieve",
          "tests": 6,
          "passed": 6,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.76
        },
        {
          "file": "test_pap_orchestrator",
          "tests": 8,
          "passed": 8,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.54
        },
        {
          "file": "test_pap_rules",
          "tests": 13,
          "passed": 13,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.54
        },
        {
          "file": "test_pap_mdm_lookup",
          "tests": 19,
          "passed": 19,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 1.06
        },
        {
          "file": "test_pap_mdm_tenant_config",
          "tests": 9,
          "passed": 9,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.27
        },
        {
          "file": "test_pap_demo_data",
          "tests": 3,
          "passed": 3,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.23
        },
        {
          "file": "test_pap_history_rules_yaml",
          "tests": 3,
          "passed": 3,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.74
        },
        {
          "file": "test_pap_history_slot_flatten",
          "tests": 5,
          "passed": 5,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.2
        },
        {
          "file": "test_pap_history_citations",
          "tests": 7,
          "passed": 7,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.4
        },
        {
          "file": "test_pap_json_intake_aliases",
          "tests": 5,
          "passed": 5,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.16
        },
        {
          "file": "test_pap_slot_compile",
          "tests": 13,
          "passed": 13,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.39
        },
        {
          "file": "test_pap_inbox_hook",
          "tests": 5,
          "passed": 5,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.23
        },
        {
          "file": "test_pap_program_model_override",
          "tests": 6,
          "passed": 6,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.85
        },
        {
          "file": "test_pap_verify",
          "tests": 14,
          "passed": 14,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.19
        },
        {
          "file": "test_pap_triage",
          "tests": 25,
          "passed": 25,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.99
        },
        {
          "file": "test_pap_triage_llm",
          "tests": 7,
          "passed": 7,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.27
        },
        {
          "file": "test_pap_triage_skip_decide",
          "tests": 3,
          "passed": 3,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.11
        },
        {
          "file": "test_pap_config_resolver",
          "tests": 10,
          "passed": 10,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.31
        },
        {
          "file": "test_load_rules_program_scoped",
          "tests": 3,
          "passed": 3,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.6
        },
        {
          "file": "test_intake_coerce_silent_drop",
          "tests": 3,
          "passed": 3,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.07
        }
      ]
    },
    {
      "id": "inbox",
      "name": "Inbox agent",
      "description": "IMAP parsing, resolver, reply mailer, replies, audit, review executor.",
      "totals": {
        "tests": 79,
        "passed": 79,
        "failed": 0,
        "errored": 0,
        "skipped": 0,
        "duration": 3.55
      },
      "files": [
        {
          "file": "test_inbox_audit",
          "tests": 5,
          "passed": 5,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.17
        },
        {
          "file": "test_inbox_imap_parse",
          "tests": 8,
          "passed": 8,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.54
        },
        {
          "file": "test_inbox_mailer",
          "tests": 6,
          "passed": 6,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.86
        },
        {
          "file": "test_inbox_pap_route",
          "tests": 7,
          "passed": 7,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.24
        },
        {
          "file": "test_inbox_replies",
          "tests": 13,
          "passed": 13,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.44
        },
        {
          "file": "test_inbox_resolver",
          "tests": 11,
          "passed": 11,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.36
        },
        {
          "file": "test_inbox_score",
          "tests": 7,
          "passed": 7,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.2
        },
        {
          "file": "test_inbox_synth",
          "tests": 6,
          "passed": 6,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.21
        },
        {
          "file": "test_inbox_test_executor",
          "tests": 3,
          "passed": 3,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.1
        },
        {
          "file": "test_inbox_test_planner",
          "tests": 6,
          "passed": 6,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.21
        },
        {
          "file": "test_inbox_test_verdict",
          "tests": 7,
          "passed": 7,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.23
        }
      ]
    },
    {
      "id": "templates",
      "name": "Templates & rendering",
      "description": "DOCX/PDF preflight, publish/rollback, locale variants, supersede, realign.",
      "totals": {
        "tests": 155,
        "passed": 154,
        "failed": 0,
        "errored": 0,
        "skipped": 1,
        "duration": 90.42
      },
      "files": [
        {
          "file": "test_pdf",
          "tests": 2,
          "passed": 1,
          "failed": 0,
          "errored": 0,
          "skipped": 1,
          "duration": 0.01
        },
        {
          "file": "test_pdf_template",
          "tests": 32,
          "passed": 32,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 25.92
        },
        {
          "file": "test_preflight",
          "tests": 15,
          "passed": 15,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 3.83
        },
        {
          "file": "test_preflight_dispatch",
          "tests": 3,
          "passed": 3,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 4.52
        },
        {
          "file": "test_preflight_job",
          "tests": 3,
          "passed": 3,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 3.95
        },
        {
          "file": "test_publish",
          "tests": 12,
          "passed": 12,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 19.91
        },
        {
          "file": "test_supersede",
          "tests": 10,
          "passed": 10,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 8.3
        },
        {
          "file": "test_locale_variant",
          "tests": 12,
          "passed": 12,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 9.71
        },
        {
          "file": "test_realign_pdf",
          "tests": 19,
          "passed": 19,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.71
        },
        {
          "file": "test_render_enqueue_failure",
          "tests": 1,
          "passed": 1,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 3.37
        },
        {
          "file": "test_render_mapped",
          "tests": 4,
          "passed": 4,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 5.6
        },
        {
          "file": "test_render_stack",
          "tests": 3,
          "passed": 3,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.17
        },
        {
          "file": "test_docx_sanitize",
          "tests": 7,
          "passed": 7,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.12
        },
        {
          "file": "test_merge",
          "tests": 4,
          "passed": 4,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.98
        },
        {
          "file": "test_freeze",
          "tests": 5,
          "passed": 5,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.22
        },
        {
          "file": "test_diff",
          "tests": 13,
          "passed": 13,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.59
        },
        {
          "file": "test_golden",
          "tests": 2,
          "passed": 2,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.45
        },
        {
          "file": "test_sample_eob",
          "tests": 4,
          "passed": 4,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.12
        },
        {
          "file": "test_publish_gate_slot_refs",
          "tests": 4,
          "passed": 4,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 1.94
        }
      ]
    },
    {
      "id": "boundaries",
      "name": "Boundaries & policy",
      "description": "Multi-tenancy isolation, SSRF/IDOR, network safety, rate limiting, per-tenant quotas.",
      "totals": {
        "tests": 37,
        "passed": 37,
        "failed": 0,
        "errored": 0,
        "skipped": 0,
        "duration": 33.31
      },
      "files": [
        {
          "file": "test_boundaries",
          "tests": 6,
          "passed": 6,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.48
        },
        {
          "file": "test_tenancy",
          "tests": 2,
          "passed": 2,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 2.25
        },
        {
          "file": "test_ssrf_and_idor",
          "tests": 5,
          "passed": 5,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 13.69
        },
        {
          "file": "test_net_safety",
          "tests": 17,
          "passed": 17,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.53
        },
        {
          "file": "test_rate_limit",
          "tests": 1,
          "passed": 1,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 2.42
        },
        {
          "file": "test_quotas",
          "tests": 6,
          "passed": 6,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 13.94
        }
      ]
    },
    {
      "id": "mcp",
      "name": "MCP surface",
      "description": "Model Context Protocol auth + idempotent tool calls.",
      "totals": {
        "tests": 5,
        "passed": 5,
        "failed": 0,
        "errored": 0,
        "skipped": 0,
        "duration": 7.36
      },
      "files": [
        {
          "file": "test_mcp_auth",
          "tests": 2,
          "passed": 2,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.94
        },
        {
          "file": "test_mcp_idempotent",
          "tests": 3,
          "passed": 3,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 6.41
        }
      ]
    },
    {
      "id": "data",
      "name": "Mapping & schema",
      "description": "Payload coercion, mapping transforms, schema/pagination invariants.",
      "totals": {
        "tests": 81,
        "passed": 76,
        "failed": 0,
        "errored": 0,
        "skipped": 5,
        "duration": 19.18
      },
      "files": [
        {
          "file": "test_mapping",
          "tests": 33,
          "passed": 33,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.57
        },
        {
          "file": "test_mapper_backfill",
          "tests": 10,
          "passed": 10,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.21
        },
        {
          "file": "test_coerce_payload",
          "tests": 5,
          "passed": 5,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.17
        },
        {
          "file": "test_schema",
          "tests": 2,
          "passed": 2,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.04
        },
        {
          "file": "test_schema_groups",
          "tests": 10,
          "passed": 10,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.29
        },
        {
          "file": "test_pagination",
          "tests": 14,
          "passed": 9,
          "failed": 0,
          "errored": 0,
          "skipped": 5,
          "duration": 17.65
        },
        {
          "file": "test_geometry",
          "tests": 7,
          "passed": 7,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.25
        }
      ]
    },
    {
      "id": "infra",
      "name": "Workers & providers",
      "description": "Idempotency, watchdog reaper, webhooks, provider config, metrics endpoint.",
      "totals": {
        "tests": 43,
        "passed": 43,
        "failed": 0,
        "errored": 0,
        "skipped": 0,
        "duration": 29.41
      },
      "files": [
        {
          "file": "test_worker_idempotency",
          "tests": 2,
          "passed": 2,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 1.78
        },
        {
          "file": "test_watchdog",
          "tests": 1,
          "passed": 1,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.69
        },
        {
          "file": "test_webhooks",
          "tests": 4,
          "passed": 4,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.64
        },
        {
          "file": "test_idempotency",
          "tests": 5,
          "passed": 5,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 18.13
        },
        {
          "file": "test_provider_config",
          "tests": 4,
          "passed": 4,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.41
        },
        {
          "file": "test_provider_nebius",
          "tests": 4,
          "passed": 4,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.41
        },
        {
          "file": "test_stub_provider",
          "tests": 3,
          "passed": 3,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.35
        },
        {
          "file": "test_metrics",
          "tests": 7,
          "passed": 7,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 1.48
        },
        {
          "file": "test_ui_smoke",
          "tests": 13,
          "passed": 13,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 5.52
        }
      ]
    },
    {
      "id": "admin_ui",
      "name": "Admin UI write-paths",
      "description": "Tenant/program configuration pages: inherit-from-tenant toggles, split Triage routing page, tenant models dropdowns, shared page-number pagination helpers, copy-a-rule-to-a-program wizard.",
      "totals": {
        "tests": 87,
        "passed": 87,
        "failed": 0,
        "errored": 0,
        "skipped": 0,
        "duration": 32.48
      },
      "files": [
        {
          "file": "test_pap_ui_inherit_and_tenant_models",
          "tests": 11,
          "passed": 11,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 12.51
        },
        {
          "file": "test_pagination_page_number",
          "tests": 26,
          "passed": 26,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.84
        },
        {
          "file": "test_rule_refs",
          "tests": 17,
          "passed": 17,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.32
        },
        {
          "file": "test_rule_mapping",
          "tests": 11,
          "passed": 11,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.21
        },
        {
          "file": "test_rule_mapping_llm",
          "tests": 8,
          "passed": 8,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.18
        },
        {
          "file": "test_rule_copy_wizard",
          "tests": 7,
          "passed": 7,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 9.86
        },
        {
          "file": "test_rule_edit_vocab_validation",
          "tests": 7,
          "passed": 7,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 8.58
        }
      ]
    },
    {
      "id": "e2e",
      "name": "End-to-end",
      "description": "Full-stack pipelines: template upload \u2192 render, and PAP intake \u2192 verdict with wire-capture proof that the resolved program \u2192 tenant \u2192 settings model reaches each stage.",
      "totals": {
        "tests": 11,
        "passed": 11,
        "failed": 0,
        "errored": 0,
        "skipped": 0,
        "duration": 15.82
      },
      "files": [
        {
          "file": "test_e2e_pipeline",
          "tests": 1,
          "passed": 1,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 14.17
        },
        {
          "file": "test_pap_e2e_config_chain",
          "tests": 6,
          "passed": 6,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 1.48
        },
        {
          "file": "test_pap_json_intake_triage",
          "tests": 4,
          "passed": 4,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.18
        }
      ]
    },
    {
      "id": "other",
      "name": "Other",
      "description": "Test files not yet mapped to a suite. Add them to SUITES in _gen_dashboard.py.",
      "totals": {
        "tests": 182,
        "passed": 182,
        "failed": 0,
        "errored": 0,
        "skipped": 0,
        "duration": 5.69
      },
      "files": [
        {
          "file": "test_open_redirect_guard",
          "tests": 23,
          "passed": 23,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.75
        },
        {
          "file": "test_pap_decision_caps",
          "tests": 15,
          "passed": 15,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.74
        },
        {
          "file": "test_pap_extract_json_scan",
          "tests": 13,
          "passed": 13,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.41
        },
        {
          "file": "test_pap_inbox_hook_reply",
          "tests": 17,
          "passed": 17,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.96
        },
        {
          "file": "test_pap_outcome_composer",
          "tests": 11,
          "passed": 11,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.45
        },
        {
          "file": "test_pap_reason_gating",
          "tests": 2,
          "passed": 2,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.11
        },
        {
          "file": "test_rule_evaluator",
          "tests": 35,
          "passed": 35,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 1.14
        },
        {
          "file": "test_rule_formula",
          "tests": 59,
          "passed": 59,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.98
        },
        {
          "file": "test_rule_translator",
          "tests": 7,
          "passed": 7,
          "failed": 0,
          "errored": 0,
          "skipped": 0,
          "duration": 0.14
        }
      ]
    }
  ]
}