{
  "schema_version": "bountycount.ports.v1",
  "generated_at": "2026-09-22T22:39:02Z",
  "total_ports": 57,
  "publishable_sources": 56,
  "counts_by_port_status": {
    "production_called": 57
  },
  "counts_by_adapter_status": {
    "production_called": 57
  },
  "ports": [
    {
      "port_id": "PORT-FBI-WANTED-01",
      "source_class": "fbi_sync",
      "adapter_module": "fbi_sync.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:FbiSyncAdapter",
        "build.py:main"
      ],
      "doctrine_gap": "typed port wired to production; differentiated provider_error/source_unavailable/adapter_error IngestState closed 2026-09-21-e (FbiSyncAdapter.fetch() now converts a raised failure itself); the adapter_error value itself added 2026-09-21-h applies here automatically, fbi_sync.py never wrapped its own exceptions, so a non-network failure was already reaching the classifier untouched, no code change needed. Still open: no per-port fixture/replay proof.",
      "governance": {
        "label": "FBI Wanted, public JSON API",
        "legal_basis": "public_record",
        "attribution": "Federal Bureau of Investigation (U.S. public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 6,
        "freshness_max_age_hours": 48,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-AGENCY-SCRAPE-01",
      "source_class": "agency_scrapers",
      "adapter_module": "agency_scrapers.py",
      "known_instances": 5,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:AgencyScrapersAdapter",
        "build.py:main"
      ],
      "doctrine_gap": "silent-empty-success (2026-09-18-e) and per-profile-breakage (2026-09-18-g) risks both closed; differentiated IngestState closed 2026-09-21-e; 2026-09-21-g preserves the real exception type through this module's own total-failure aggregation (via `raise ... from <cause>`), so a genuine network outage now classifies as source_unavailable instead of always defaulting to the safe-default bucket; 2026-09-21-h gave that safe-default bucket its own dedicated 'adapter_error' IngestState value (a stale selector or parsing bug now reads distinctly from a genuine provider error status), closing what 2026-09-21-f found premature before the chaining fix existed. Still open: a quiet list page with zero candidate links still reads as empty success, on purpose.",
      "governance": {
        "label": "DEA / ATF / ICE / USSS / RFJ wanted pages",
        "legal_basis": "public_record",
        "attribution": "Respective U.S. federal agencies (public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-USMS-01",
      "source_class": "usms_scraper",
      "adapter_module": "usms_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:UsmsScraperAdapter",
        "build.py:main"
      ],
      "doctrine_gap": "same shape as PORT-AGENCY-SCRAPE-01; its own per-profile-breakage fix closed 2026-09-21, differentiated IngestState closed 2026-09-21-e, exception-chaining fix (source_unavailable now reachable through its own aggregation) closed 2026-09-21-g, dedicated adapter_error IngestState value closed 2026-09-21-h.",
      "governance": {
        "label": "U.S. Marshals, 15 Most Wanted",
        "legal_basis": "public_record",
        "attribution": "U.S. Marshals Service (U.S. public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-INTERPOL-01",
      "source_class": "interpol_scraper",
      "adapter_module": "interpol_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:InterpolScraperAdapter",
        "build.py:main"
      ],
      "doctrine_gap": "inspected 2026-09-21-d for the per-profile-breakage shape and found it does NOT apply (name/thumbnail come from the list page, not the per-notice detail fetch); a real, narrower gap, silent detail-fetch failures, closed instead. Differentiated IngestState closed 2026-09-21-e; its total-failure raise already kept the real exception object (unlike the other 4 aggregation modules), so 2026-09-21-g only needed to chain it via `from`, at no cost. Dedicated adapter_error IngestState value closed 2026-09-21-h, same as every other row in this catalog.",
      "governance": {
        "label": "Interpol Red Notices, public API",
        "legal_basis": "public_api",
        "attribution": "INTERPOL public Red Notices API",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 6,
        "freshness_max_age_hours": 48,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-NEWSWIRE-01",
      "source_class": "news_ingest",
      "adapter_module": "news_ingest.py",
      "known_instances": 3,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:NewsIngestAdapter",
        "build.py:main"
      ],
      "doctrine_gap": "least severe: already had tested partial-failure handling before this session; differentiated IngestState closed 2026-09-21-e; 2026-09-21-g chains the last failed feed's real exception via `from`, so a genuine network outage across every feed classifies as source_unavailable; 2026-09-21-h adds the dedicated adapter_error value for a non-network failure.",
      "governance": {
        "label": "Crime / fugitive newswire",
        "legal_basis": "syndication",
        "attribution": "Headline + link only, attributed to the original publisher",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "news"
        ],
        "min_interval_hours": 3,
        "freshness_max_age_hours": 48,
        "failure_circuit_threshold": 4
      }
    },
    {
      "port_id": "PORT-CASE-PHOTOS-01",
      "source_class": "fetch_photos",
      "adapter_module": "fetch_photos.py",
      "known_instances": 0,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:FetchPhotosAdapter",
        "build.py:main"
      ],
      "doctrine_gap": "enrichment-only, lowest stakes; differentiated IngestState closed 2026-09-21-e; adapter_error value (2026-09-21-h) applies automatically, same reason as PORT-FBI-WANTED-01, fetch_photos.py never wrapped its own exceptions either.",
      "governance": {
        "label": "Official case-photo enrichment",
        "legal_basis": "public_record",
        "attribution": "Each case's own official source_url",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "enrichment"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 5
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-TX-01",
      "source_class": "state_police_tx",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(TX)",
        "build.py:main"
      ],
      "doctrine_gap": "selectors unverified against live markup (no network access when built); per-state total-failure fix closed 2026-09-21-b, differentiated IngestState closed 2026-09-21-e, a broken selector now reaches source_health.json as a classified state, not a bare error string; 2026-09-21-g additionally lets a genuine network outage (as opposed to a stale selector) classify as source_unavailable through this module's own two-level aggregation; 2026-09-21-h gives the stale-selector case itself a dedicated adapter_error value, distinct from a real outage.",
      "governance": {
        "label": "Texas DPS, 10 Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Texas Department of Public Safety (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-FL-01",
      "source_class": "state_police_fl",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(FL)",
        "build.py:main"
      ],
      "doctrine_gap": "same shape and same closures as PORT-STATE-POLICE-WANTED-TX-01.",
      "governance": {
        "label": "Florida FDLE, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Florida Department of Law Enforcement (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-CA-01",
      "source_class": "state_police_ca",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(CA)",
        "build.py:main"
      ],
      "doctrine_gap": "3rd instance, added 2026-09-21-f, already carrying every fix the first two instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, the 2026-09-21-g exception-chaining fix, and the 2026-09-21-h dedicated adapter_error value) since it shares their one adapter class and one state_police_scraper.py module. Selectors unverified against live markup, same caveat as TX/FL.",
      "governance": {
        "label": "California DOJ, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "California Department of Justice (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-GA-01",
      "source_class": "state_police_ga",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(GA)",
        "build.py:main"
      ],
      "doctrine_gap": "4th instance, added 2026-09-21-i, already carrying every fix the first three instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, the 2026-09-21-g exception-chaining fix, and the 2026-09-21-h dedicated adapter_error value) since it shares their one adapter class and one state_police_scraper.py module. Selectors unverified against live markup, same caveat as TX/FL/CA.",
      "governance": {
        "label": "Georgia GBI, Wanted Fugitives",
        "legal_basis": "public_record",
        "attribution": "Georgia Bureau of Investigation (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-NY-01",
      "source_class": "state_police_ny",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(NY)",
        "build.py:main"
      ],
      "doctrine_gap": "5th instance, added 2026-09-21-j, same shape and same closures as PORT-STATE-POLICE-WANTED-GA-01. Selectors unverified against live markup, same caveat as every instance above.",
      "governance": {
        "label": "New York State Police, Wanted Fugitives",
        "legal_basis": "public_record",
        "attribution": "New York State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-OH-01",
      "source_class": "state_police_oh",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(OH)",
        "build.py:main"
      ],
      "doctrine_gap": "6th instance, added 2026-09-21-j, same shape and same closures as PORT-STATE-POLICE-WANTED-GA-01. Selectors unverified against live markup, same caveat as every instance above.",
      "governance": {
        "label": "Ohio Attorney General, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Ohio Attorney General (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-PA-01",
      "source_class": "state_police_pa",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(PA)",
        "build.py:main"
      ],
      "doctrine_gap": "7th instance, added 2026-09-21-j, same shape and same closures as PORT-STATE-POLICE-WANTED-GA-01. Selectors unverified against live markup, same caveat as every instance above.",
      "governance": {
        "label": "Pennsylvania State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Pennsylvania State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-IL-01",
      "source_class": "state_police_il",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(IL)",
        "build.py:main"
      ],
      "doctrine_gap": "8th instance, added 2026-09-21-j, same shape and same closures as PORT-STATE-POLICE-WANTED-GA-01. Selectors unverified against live markup, same caveat as every instance above.",
      "governance": {
        "label": "Illinois State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Illinois State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-AZ-01",
      "source_class": "state_police_az",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(AZ)",
        "build.py:main"
      ],
      "doctrine_gap": "9th instance, added 2026-09-21-j, same shape and same closures as PORT-STATE-POLICE-WANTED-GA-01. Selectors unverified against live markup, same caveat as every instance above.",
      "governance": {
        "label": "Arizona DPS, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Arizona Department of Public Safety (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-TN-01",
      "source_class": "state_police_tn",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(TN)",
        "build.py:main"
      ],
      "doctrine_gap": "10th instance, added 2026-09-21-j, same shape and same closures as PORT-STATE-POLICE-WANTED-GA-01. Selectors unverified against live markup, same caveat as every instance above.",
      "governance": {
        "label": "Tennessee TBI, Top 10 Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Tennessee Bureau of Investigation (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-NC-01",
      "source_class": "state_police_nc",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(NC)",
        "build.py:main"
      ],
      "doctrine_gap": "11th instance, added 2026-09-21-j, same shape and same closures as PORT-STATE-POLICE-WANTED-GA-01. Selectors unverified against live markup, same caveat as every instance above.",
      "governance": {
        "label": "North Carolina SBI, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "North Carolina State Bureau of Investigation (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-VA-01",
      "source_class": "state_police_va",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(VA)",
        "build.py:main"
      ],
      "doctrine_gap": "12th instance, added 2026-09-21-j, same shape and same closures as PORT-STATE-POLICE-WANTED-GA-01. Selectors unverified against live markup, same caveat as every instance above.",
      "governance": {
        "label": "Virginia State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Virginia State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-WA-01",
      "source_class": "state_police_wa",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(WA)",
        "build.py:main"
      ],
      "doctrine_gap": "13th instance, added 2026-09-21-j, same shape and same closures as PORT-STATE-POLICE-WANTED-GA-01. Selectors unverified against live markup, same caveat as every instance above.",
      "governance": {
        "label": "Washington State Patrol, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Washington State Patrol (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-MO-01",
      "source_class": "state_police_mo",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(MO)",
        "build.py:main"
      ],
      "doctrine_gap": "14th instance, added 2026-09-21-j, same shape and same closures as PORT-STATE-POLICE-WANTED-GA-01. Selectors unverified against live markup, same caveat as every instance above.",
      "governance": {
        "label": "Missouri Highway Patrol, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Missouri State Highway Patrol (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-AL-01",
      "source_class": "state_police_al",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(AL)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Alabama Law Enforcement Agency, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Alabama Law Enforcement Agency (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-AK-01",
      "source_class": "state_police_ak",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(AK)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Alaska State Troopers, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Alaska State Troopers (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-AR-01",
      "source_class": "state_police_ar",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(AR)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Arkansas State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Arkansas State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-CO-01",
      "source_class": "state_police_co",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(CO)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Colorado Bureau of Investigation, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Colorado Bureau of Investigation (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-CT-01",
      "source_class": "state_police_ct",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(CT)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Connecticut State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Connecticut State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-DE-01",
      "source_class": "state_police_de",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(DE)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Delaware State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Delaware State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-ID-01",
      "source_class": "state_police_id",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(ID)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Idaho State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Idaho State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-IN-01",
      "source_class": "state_police_in",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(IN)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Indiana State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Indiana State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-IA-01",
      "source_class": "state_police_ia",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(IA)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Iowa Division of Criminal Investigation, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Iowa Division of Criminal Investigation (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-KS-01",
      "source_class": "state_police_ks",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(KS)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Kansas Bureau of Investigation, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Kansas Bureau of Investigation (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-KY-01",
      "source_class": "state_police_ky",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(KY)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Kentucky State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Kentucky State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-LA-01",
      "source_class": "state_police_la",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(LA)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Louisiana State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Louisiana State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-ME-01",
      "source_class": "state_police_me",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(ME)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Maine State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Maine State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-MD-01",
      "source_class": "state_police_md",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(MD)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Maryland State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Maryland State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-MA-01",
      "source_class": "state_police_ma",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(MA)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Massachusetts State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Massachusetts State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-MI-01",
      "source_class": "state_police_mi",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(MI)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Michigan State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Michigan State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-MN-01",
      "source_class": "state_police_mn",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(MN)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Minnesota Bureau of Criminal Apprehension, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Minnesota Bureau of Criminal Apprehension (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-MS-01",
      "source_class": "state_police_ms",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(MS)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Mississippi Bureau of Investigation, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Mississippi Bureau of Investigation (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-MT-01",
      "source_class": "state_police_mt",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(MT)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Montana Department of Justice, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Montana Department of Justice (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-NE-01",
      "source_class": "state_police_ne",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(NE)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Nebraska State Patrol, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Nebraska State Patrol (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-NV-01",
      "source_class": "state_police_nv",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(NV)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Nevada Department of Public Safety, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Nevada Department of Public Safety (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-NH-01",
      "source_class": "state_police_nh",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(NH)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "New Hampshire State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "New Hampshire State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-NJ-01",
      "source_class": "state_police_nj",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(NJ)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "New Jersey State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "New Jersey State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-NM-01",
      "source_class": "state_police_nm",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(NM)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "New Mexico State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "New Mexico State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-ND-01",
      "source_class": "state_police_nd",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(ND)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "North Dakota Bureau of Criminal Investigation, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "North Dakota Bureau of Criminal Investigation (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-OK-01",
      "source_class": "state_police_ok",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(OK)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Oklahoma State Bureau of Investigation, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Oklahoma State Bureau of Investigation (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-OR-01",
      "source_class": "state_police_or",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(OR)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Oregon State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Oregon State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-RI-01",
      "source_class": "state_police_ri",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(RI)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Rhode Island State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Rhode Island State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-SC-01",
      "source_class": "state_police_sc",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(SC)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "South Carolina Law Enforcement Division, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "South Carolina Law Enforcement Division (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-SD-01",
      "source_class": "state_police_sd",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(SD)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "South Dakota Division of Criminal Investigation, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "South Dakota Division of Criminal Investigation (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-UT-01",
      "source_class": "state_police_ut",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(UT)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Utah Department of Public Safety, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Utah Department of Public Safety (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-VT-01",
      "source_class": "state_police_vt",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(VT)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Vermont State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Vermont State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-WV-01",
      "source_class": "state_police_wv",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(WV)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "West Virginia State Police, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "West Virginia State Police (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-WI-01",
      "source_class": "state_police_wi",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(WI)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Wisconsin Department of Justice, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Wisconsin Department of Justice (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-STATE-POLICE-WANTED-WY-01",
      "source_class": "state_police_wy",
      "adapter_module": "state_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:StatePoliceScraperAdapter(WY)",
        "build.py:main"
      ],
      "doctrine_gap": "added 2026-09-22 as part of the 35-state batch that completed the U.S. roster (every state but Hawaii, see state_police_scraper.py's module docstring for why), already carrying every fix earlier instances needed separate passes to get (per-state total-failure raise, differentiated IngestState, exception-chaining, dedicated adapter_error value) since it shares the one adapter class and one state_police_scraper.py module every instance runs through. Selectors unverified against live markup, same caveat as every instance before it.",
      "governance": {
        "label": "Wyoming Division of Criminal Investigation, Most Wanted",
        "legal_basis": "public_record",
        "attribution": "Wyoming Division of Criminal Investigation (state public domain)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-HONOLULU-CRIME-STOPPERS-01",
      "source_class": "honolulu_crime_stoppers",
      "adapter_module": "honolulu_crime_stoppers_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:HonoluluCrimeStoppersAdapter",
        "build.py:main"
      ],
      "doctrine_gap": "verified live (WebSearch + WebFetch against the real site, 2026-09-22) rather than constructed from memory the way every state_police_scraper.py instance was, the PAGE STRUCTURE (paginated list, no per-suspect detail links, dollar figures are bench-warrant amounts not tip rewards) is confirmed real, though exact CSS class names are still a plausible construction (WebFetch returns processed content, not raw HTML at the class-name level), same caveat every other instance in this catalog carries. Known, named gap: fetches PAGE 1 ONLY of the real site's 9-page listing, honolulucrimestoppers.org is ASP.NET WebForms, whose pagination is commonly postback-based (__VIEWSTATE/__EVENTTARGET on a POST) rather than a plain `?page=N` GET URL, and this author has no confident, verified knowledge of which this site uses, guessing would have reintroduced the exact fabrication risk this whole pass was trying to avoid. Governance note, corrected 2026-09-22 same day (see domain/source_governance.py's honolulu_crime_stoppers policy and honolulu_crime_stoppers_scraper.py's module docstring 'CORRECTION' section for the full story): this row's legal_basis is \"corroboration_only\", not \"public_record\" the way every state_police_* row is, doc 18 (Sections 4 and 8) already classified Crimestoppers-type sources as reward-mention/manual-review signal only, never classification-authoritative, before this session started. First shipped this same day with legal_basis=\"community_partnership\" marked fully publishable, which missed that doctrine; fixed same day once it was found. This adapter still runs every build (port_status/adapter_status stay \"production_called\", it genuinely is called), but its rows are now quarantined by domain/provenance_gate.py rather than published, and its real-world scope remains Honolulu County, not the whole state of Hawaii (the `state`/`state_name` fields on its rows say HI/Hawaii for location purposes, but `location` says \"Honolulu, HI\" specifically so this is never read as statewide coverage).",
      "governance": {
        "label": "Crime Stoppers of Honolulu, Wanted Suspects",
        "legal_basis": "corroboration_only",
        "attribution": "Crime Stoppers of Honolulu, Inc. (nonprofit tipline; partners with Honolulu PD and other Oahu-based agencies; Honolulu County only, not statewide; corroboration/reward-mention signal only, per doc 18 Sections 4 and 8, never classification-authoritative)",
        "live_ingestion_enabled": true,
        "publishable": false,
        "categories": [
          "reward_mention_corroboration"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    },
    {
      "port_id": "PORT-COUNTY-POLICE-WANTED-01",
      "source_class": "honolulu_pd_wanted",
      "adapter_module": "county_police_scraper.py",
      "known_instances": 1,
      "port_status": "production_called",
      "adapter_status": "production_called",
      "production_call_sites": [
        "ports/adapters.py:CountyPoliceScraperAdapter",
        "build.py:main"
      ],
      "doctrine_gap": "verified live (WebFetch against honolulupd.org, 2026-09-22): a real, government-run, WordPress-based \"Wanted Persons\" page with genuine per-case detail pages (confirmed href pattern /cid/<slug>/) and confirmed real pagination (/information/wanted-persons/page/N/). legal_basis=\"public_record\" (a government agency's own page), a more authoritative basis than honolulu_crime_stoppers's \"corroboration_only\". Two named, real differences from every state_police_* instance: (1) identification is by internal case reference, not the suspect's real name (confirmed real via the fetch, privacy/pre-charge practice, not this author's construction); (2) no reward amounts are ever shown on the real page, so reward/reward_text stay at their honest zero/empty defaults. Known, named gap: this module's pagination walk cannot distinguish a genuinely-last page from a transient fetch failure on a later page (a blind /page/N/ probe, not a parsed \"next\" link), the module docstring credits this as a lesson from ParksRadar's own SourceGovernance.ts (CIRCUIT-02/03), studied this same pass, about never letting a budget/policy limitation of OURS look identical to a clean, honest result. Also named, also not fabricated around: `jurisdiction=county`, doc 18's own SPECIFIED contract field for this pattern, is not actually implemented in contracts/schema.py/db.py/dto.py, same pre-existing gap every one of the 49 state_police_* instances already carries (none of them populate a jurisdiction field either, despite doc 18 spec'ing jurisdiction=state for that pattern too), not a new gap invented for this instance alone. Real-world scope is Honolulu County only, not the whole state of Hawaii, of the other three Hawaii counties checked in the same research pass, Hawaii County (Big Island) PD's old wanted-persons page is archived with no structured replacement, and Maui/Kauai PD have no official wanted-persons list pages at all, only one-off press releases, named DISCOVERED gaps, not silently treated as covered by this one instance.",
      "governance": {
        "label": "Honolulu Police Department, Wanted Persons",
        "legal_basis": "public_record",
        "attribution": "Honolulu Police Department, City & County of Honolulu (government agency public record; case-number identification, not named suspects, see county_police_scraper.py's module docstring; Honolulu County only, not statewide)",
        "live_ingestion_enabled": true,
        "publishable": true,
        "categories": [
          "wanted"
        ],
        "min_interval_hours": 12,
        "freshness_max_age_hours": 72,
        "failure_circuit_threshold": 3
      }
    }
  ]
}