{
  "comparators": [
    {
      "availability_state": "selected_public_pages_acquired",
      "comparator_id": "michiganvotes",
      "homepage_url": "https://www.michiganvotes.org/",
      "name": "MichiganVotes",
      "scope_note": "Three deliberately selected roll-call pages spanning 2021, 2023, and 2025. This is a spot check, not a comprehensive comparison."
    },
    {
      "availability_state": "bulk_or_api_account_required_not_acquired",
      "comparator_id": "openstates",
      "homepage_url": "https://open.pluralpolicy.com/mi/",
      "name": "Plural Open / Open States",
      "scope_note": "The public bulk-data description advertises per-session bill and vote archives, but the current download route redirects anonymous users to login and the Michigan landing page returned HTTP 500 during the 2026-07-28 acquisition attempt."
    },
    {
      "availability_state": "api_access_key_required_not_acquired",
      "comparator_id": "legiscan",
      "homepage_url": "https://legiscan.com/MI/datasets",
      "name": "LegiScan",
      "scope_note": "The bulk API requires an API key, dataset session ID, and access key. No credential or dataset snapshot is part of this release."
    }
  ],
  "comparisons": [
    {
      "agreement_field_count": 4,
      "benchmark_id": "michiganvotes-2021-senate-roll-call-100",
      "chamber": "senate",
      "comparable_field_count": 4,
      "comparator_id": "michiganvotes",
      "comparison_state": "agree_on_all_comparable_fields",
      "complete_record_comparison": true,
      "content_sha256": "1ff1aa03e68f03421df867a0b1c4d75e1f6bfffa74aca182a1a81bfb78983331",
      "disagreement_field_count": 0,
      "excused_or_not_voting": 2,
      "fields": [
        {
          "external_value": "passed",
          "field": "result",
          "release_value": "passed",
          "state": "agree"
        },
        {
          "external_value": 29,
          "field": "yeas",
          "release_value": 29,
          "state": "agree"
        },
        {
          "external_value": 5,
          "field": "nays",
          "release_value": 5,
          "state": "agree"
        },
        {
          "external_value": 2,
          "field": "excused_or_not_voting",
          "release_value": 2,
          "state": "agree"
        }
      ],
      "http_status": 200,
      "nays": 5,
      "release_public_path": "/votes/vote-9503/",
      "release_vote_date": "2021-04-22",
      "release_vote_id": "vote-9503",
      "result": "passed",
      "roll_call_number": 100,
      "source_url": "https://www.michiganvotes.org/votes/2021/senate/roll-call-100",
      "year": 2021,
      "yeas": 29
    },
    {
      "agreement_field_count": 3,
      "benchmark_id": "michiganvotes-2023-house-roll-call-200",
      "chamber": "house",
      "comparable_field_count": 3,
      "comparator_id": "michiganvotes",
      "comparison_state": "agree_on_all_comparable_fields",
      "complete_record_comparison": false,
      "content_sha256": "5acd5e5f2dc30f020e95eff67324b6fc46c0837c4512caf0c106a259d7f79574",
      "disagreement_field_count": 0,
      "excused_or_not_voting": 1,
      "fields": [
        {
          "external_value": "passed",
          "field": "result",
          "release_value": "passed",
          "state": "agree"
        },
        {
          "external_value": 105,
          "field": "yeas",
          "release_value": 105,
          "state": "agree"
        },
        {
          "external_value": 4,
          "field": "nays",
          "release_value": 4,
          "state": "agree"
        },
        {
          "external_value": 1,
          "field": "excused_or_not_voting",
          "release_value": null,
          "state": "local_value_not_recorded"
        }
      ],
      "http_status": 200,
      "nays": 4,
      "release_public_path": "/votes/vote-2883/",
      "release_vote_date": "2023-06-21",
      "release_vote_id": "vote-2883",
      "result": "passed",
      "roll_call_number": 200,
      "source_url": "https://www.michiganvotes.org/votes/2023/house/roll-call-200",
      "year": 2023,
      "yeas": 105
    },
    {
      "agreement_field_count": 3,
      "benchmark_id": "michiganvotes-2025-house-roll-call-80",
      "chamber": "house",
      "comparable_field_count": 3,
      "comparator_id": "michiganvotes",
      "comparison_state": "agree_on_all_comparable_fields",
      "complete_record_comparison": false,
      "content_sha256": "277fab8436797823b7fee93367680677d9568e46e6a06bb1dde6c46e7e8d5b4e",
      "disagreement_field_count": 0,
      "excused_or_not_voting": 4,
      "fields": [
        {
          "external_value": "passed",
          "field": "result",
          "release_value": "passed",
          "state": "agree"
        },
        {
          "external_value": 105,
          "field": "yeas",
          "release_value": 105,
          "state": "agree"
        },
        {
          "external_value": 1,
          "field": "nays",
          "release_value": 1,
          "state": "agree"
        },
        {
          "external_value": 4,
          "field": "excused_or_not_voting",
          "release_value": null,
          "state": "local_value_not_recorded"
        }
      ],
      "http_status": 200,
      "nays": 1,
      "release_public_path": "/votes/vote-1391/",
      "release_vote_date": "2025-05-01",
      "release_vote_id": "vote-1391",
      "result": "passed",
      "roll_call_number": 80,
      "source_url": "https://www.michiganvotes.org/votes/2025/house/roll-call-80",
      "year": 2025,
      "yeas": 105
    }
  ],
  "data_through": "2026-07-27",
  "database_sha256": "bfdbe2ce37a5a159da6b9781c5de439a60b6459ac2938e1a02edc16aa20af0e1",
  "external_observations_retrieved_at": "2026-07-28T00:15:00-04:00",
  "publication_boundary": "External aggregators are comparators, not authoritative replacements for official source artifacts. Three exact roll-call spot checks cannot establish comprehensive extraction accuracy.",
  "release_id": "2026-07-28.3",
  "schema_version": "1.0.0",
  "sql": "SELECT\n    vote_id,\n    vote_date,\n    result,\n    yeas,\n    nays,\n    excused,\n    not_voting\nFROM vote\nWHERE chamber = :chamber\n  AND substr(vote_date, 1, 4) = :year\n  AND vote_number = :roll_call_number",
  "summary": {
    "agree_on_all_comparable_fields": 3,
    "comparators_not_acquired": 2,
    "complete_record_comparisons": 1,
    "selected_roll_calls": 3,
    "with_disagreement": 0
  }
}
