# How a US election is run, counted and certified

> A process map exported from forks.world (https://forks.world). Author: Brian. Source: https://forks.world/p/cmv0kpjer001vjn06qv1dm5t3
> It describes who does what, in what order, and with which technology. Read the plain-language sections first; the JSON at the end is the exact, complete data.

## Summary

- 23 steps across 3 layers
- Persona: Voters, Local election officials, Campaigns and observers, Media, Courts, State officials

## Pain points

Where this process hurts, worst first:

- **Unofficial results and projections** (How a US election is run, counted and certified; painful): Projections are not official results, and early counts can swing as mail and provisional ballots are counted

## How to read this file

- A process is made of **layers**. The main layer is the top level; any step of kind `subprocess` opens a detail layer with its own lanes and steps.
- **Lanes** are either persona (people/roles) or technology (systems). Each step belongs to one lane; `using` lists tools a person uses for that step.
- Step kinds: `start`, `task`, `decision` (its arrows carry the answer as a label), `subprocess`, `end`.

## How a US election is run, counted and certified

Lanes:
- Voters: person / role (id `voter`)
- Local election officials: person / role (id `officials`)
- Campaigns and observers: person / role (id `parties`)
- Media: person / role (id `media`)
- Courts: person / role (id `courts`)
- State officials: person / role (id `state`)

Steps, in the order they run:

1. **Register to vote** [start; Voters; id `v1`]
   - then Vote: early, by mail or on election day
2. **Vote: early, by mail or on election day** [subprocess; Voters; id `v2`], opens the detail layer "Casting a ballot"
   - then Polls close and counting begins
3. **Polls close and counting begins** [task; Local election officials; id `v3`]
   - then Unofficial results and projections
4. **Unofficial results and projections** [task; Media; id `v4`] ⚠ PAIN POINT (painful): Projections are not official results, and early counts can swing as mail and provisional ballots are counted
   - then Canvass: check every ballot, signature and provisional ballot
5. **Canvass: check every ballot, signature and provisional ballot** [subprocess; Local election officials; id `v5`], opens the detail layer "The canvass"
   - then Is the margin extremely tight?
6. **Is the margin extremely tight?** [decision; Local election officials; id `v6`]
   - if "Yes" go to An automatic recount or audit; if "No" go to The county certifies its results
7. **An automatic recount or audit** [task; Local election officials; id `v7`]
   - then The county certifies its results
8. **The county certifies its results** [task; Local election officials; id `v8`]
   - then The state certifies the statewide result
9. **The state certifies the statewide result** [task; State officials; id `v9`]
   - then Is there a legal challenge?
10. **Is there a legal challenge?** [decision; Campaigns and observers; id `v10`]
   - if "Yes" go to Courts decide on the evidence; if "No" go to The result is final
11. **Courts decide on the evidence** [task; Courts; id `v11`]
   - then The result is final
12. **The result is final** [task; State officials; id `v12`]
   - then Electors are certified
13. **Electors are certified** [end; State officials; id `v13`]

```mermaid
flowchart LR
  subgraph l_voter["Voters"]
    n_v1(["Register to vote"])
    n_v2[["Vote: early, by mail or on election day"]]
  end
  subgraph l_officials["Local election officials"]
    n_v3["Polls close and counting begins"]
    n_v5[["Canvass: check every ballot, signature and provisional ballot"]]
    n_v6{"Is the margin extremely tight?"}
    n_v7["An automatic recount or audit"]
    n_v8["The county certifies its results"]
  end
  subgraph l_parties["Campaigns and observers"]
    n_v10{"Is there a legal challenge?"}
  end
  subgraph l_media["Media"]
    n_v4["Unofficial results and projections"]
  end
  subgraph l_courts["Courts"]
    n_v11["Courts decide on the evidence"]
  end
  subgraph l_state["State officials"]
    n_v9["The state certifies the statewide result"]
    n_v12["The result is final"]
    n_v13(["Electors are certified"])
  end
  n_v1 --> n_v2
  n_v2 --> n_v3
  n_v3 --> n_v4
  n_v4 --> n_v5
  n_v5 --> n_v6
  n_v6 -->|"Yes"| n_v7
  n_v6 -->|"No"| n_v8
  n_v7 --> n_v8
  n_v8 --> n_v9
  n_v9 --> n_v10
  n_v10 -->|"Yes"| n_v11
  n_v10 -->|"No"| n_v12
  n_v11 --> n_v12
  n_v12 --> n_v13
```

### Casting a ballot (detail of step "Vote: early, by mail or on election day")

Lanes:
- Voters: person / role (id `voter`)
- Local election officials: person / role (id `officials`)

Steps, in the order they run:

1. **Find your polling place or your ballot options** [start; Voters; id `x1`]
   - then Do you have the required ID?
2. **Do you have the required ID?** [decision; Voters; id `x2`]
   - if "Yes" go to Mark and submit the ballot; if "No" go to A provisional ballot is cast and verified later
3. **Mark and submit the ballot** [task; Voters; id `x3`]
   - then A scanner or a hand count records it
4. **A scanner or a hand count records it** [end; Local election officials; id `x4`]
5. **A provisional ballot is cast and verified later** [task; Local election officials; id `x2a`]
   - then Mark and submit the ballot

```mermaid
flowchart LR
  subgraph l_voter["Voters"]
    n_x1(["Find your polling place or your ballot options"])
    n_x2{"Do you have the required ID?"}
    n_x3["Mark and submit the ballot"]
  end
  subgraph l_officials["Local election officials"]
    n_x2a["A provisional ballot is cast and verified later"]
    n_x4(["A scanner or a hand count records it"])
  end
  n_x1 --> n_x2
  n_x2 -->|"Yes"| n_x3
  n_x2 -->|"No"| n_x2a
  n_x2a --> n_x3
  n_x3 --> n_x4
```

### The canvass (detail of step "Canvass: check every ballot, signature and provisional ballot")

Lanes:
- Local election officials: person / role (id `officials`)
- Campaigns and observers: person / role (id `parties`)
- Voters: person / role (id `voter`)

Steps, in the order they run:

1. **Match mail-ballot signatures and voter records** [start; Local election officials; id `c1`]
   - then Is there a problem?
2. **Is there a problem?** [decision; Local election officials; id `c2`]
   - if "Yes" go to The voter is contacted to fix it (cure), where allowed; if "No" go to Add the valid ballots to the count
3. **The voter is contacted to fix it (cure), where allowed** [task; Voters; id `c3`]
   - then Add the valid ballots to the count
4. **Add the valid ballots to the count** [task; Local election officials; id `c4`]
   - then Observers from both parties watch the process
5. **Observers from both parties watch the process** [end; Campaigns and observers; id `c5`]

```mermaid
flowchart LR
  subgraph l_officials["Local election officials"]
    n_c1(["Match mail-ballot signatures and voter records"])
    n_c2{"Is there a problem?"}
    n_c4["Add the valid ballots to the count"]
  end
  subgraph l_parties["Campaigns and observers"]
    n_c5(["Observers from both parties watch the process"])
  end
  subgraph l_voter["Voters"]
    n_c3["The voter is contacted to fix it (cure), where allowed"]
  end
  n_c1 --> n_c2
  n_c2 -->|"Yes"| n_c3
  n_c2 -->|"No"| n_c4
  n_c3 --> n_c4
  n_c4 --> n_c5
```

## Full data (JSON)

```json
{
  "title": "How a US election is run, counted and certified",
  "maps": {
    "m_root": {
      "id": "m_root",
      "lanes": [
        {
          "id": "voter",
          "name": "Voters",
          "type": "person"
        },
        {
          "id": "officials",
          "name": "Local election officials",
          "type": "person"
        },
        {
          "id": "parties",
          "name": "Campaigns and observers",
          "type": "person"
        },
        {
          "id": "media",
          "name": "Media",
          "type": "person"
        },
        {
          "id": "courts",
          "name": "Courts",
          "type": "person"
        },
        {
          "id": "state",
          "name": "State officials",
          "type": "person"
        }
      ],
      "steps": [
        {
          "id": "v1",
          "kind": "start",
          "lane": "voter",
          "next": [
            {
              "to": "v2"
            }
          ],
          "uses": [],
          "label": "Register to vote"
        },
        {
          "id": "v2",
          "kind": "subprocess",
          "lane": "voter",
          "next": [
            {
              "to": "v3"
            }
          ],
          "uses": [],
          "child": "m_vote",
          "label": "Vote: early, by mail or on election day"
        },
        {
          "id": "v3",
          "kind": "task",
          "lane": "officials",
          "next": [
            {
              "to": "v4"
            }
          ],
          "uses": [],
          "label": "Polls close and counting begins"
        },
        {
          "id": "v4",
          "kind": "task",
          "lane": "media",
          "next": [
            {
              "to": "v5"
            }
          ],
          "pain": {
            "note": "Projections are not official results, and early counts can swing as mail and provisional ballots are counted",
            "level": 2
          },
          "uses": [],
          "label": "Unofficial results and projections"
        },
        {
          "id": "v5",
          "kind": "subprocess",
          "lane": "officials",
          "next": [
            {
              "to": "v6"
            }
          ],
          "uses": [],
          "child": "m_canvass",
          "label": "Canvass: check every ballot, signature and provisional ballot"
        },
        {
          "id": "v6",
          "kind": "decision",
          "lane": "officials",
          "next": [
            {
              "to": "v7",
              "label": "Yes"
            },
            {
              "to": "v8",
              "label": "No"
            }
          ],
          "uses": [],
          "label": "Is the margin extremely tight?"
        },
        {
          "id": "v7",
          "kind": "task",
          "lane": "officials",
          "next": [
            {
              "to": "v8"
            }
          ],
          "uses": [],
          "label": "An automatic recount or audit"
        },
        {
          "id": "v8",
          "kind": "task",
          "lane": "officials",
          "next": [
            {
              "to": "v9"
            }
          ],
          "uses": [],
          "label": "The county certifies its results"
        },
        {
          "id": "v9",
          "kind": "task",
          "lane": "state",
          "next": [
            {
              "to": "v10"
            }
          ],
          "uses": [],
          "label": "The state certifies the statewide result"
        },
        {
          "id": "v10",
          "kind": "decision",
          "lane": "parties",
          "next": [
            {
              "to": "v11",
              "label": "Yes"
            },
            {
              "to": "v12",
              "label": "No"
            }
          ],
          "uses": [],
          "label": "Is there a legal challenge?"
        },
        {
          "id": "v11",
          "kind": "task",
          "lane": "courts",
          "next": [
            {
              "to": "v12"
            }
          ],
          "uses": [],
          "label": "Courts decide on the evidence"
        },
        {
          "id": "v12",
          "kind": "task",
          "lane": "state",
          "next": [
            {
              "to": "v13"
            }
          ],
          "uses": [],
          "label": "The result is final"
        },
        {
          "id": "v13",
          "kind": "end",
          "lane": "state",
          "next": [],
          "uses": [],
          "label": "Electors are certified"
        }
      ],
      "title": "How a US election is run, counted and certified",
      "parent": null
    },
    "m_vote": {
      "id": "m_vote",
      "lanes": [
        {
          "id": "voter",
          "name": "Voters",
          "type": "person"
        },
        {
          "id": "officials",
          "name": "Local election officials",
          "type": "person"
        }
      ],
      "steps": [
        {
          "id": "x1",
          "kind": "start",
          "lane": "voter",
          "next": [
            {
              "to": "x2"
            }
          ],
          "uses": [],
          "label": "Find your polling place or your ballot options"
        },
        {
          "id": "x2",
          "kind": "decision",
          "lane": "voter",
          "next": [
            {
              "to": "x3",
              "label": "Yes"
            },
            {
              "to": "x2a",
              "label": "No"
            }
          ],
          "uses": [],
          "label": "Do you have the required ID?"
        },
        {
          "id": "x2a",
          "kind": "task",
          "lane": "officials",
          "next": [
            {
              "to": "x3"
            }
          ],
          "uses": [],
          "label": "A provisional ballot is cast and verified later"
        },
        {
          "id": "x3",
          "kind": "task",
          "lane": "voter",
          "next": [
            {
              "to": "x4"
            }
          ],
          "uses": [],
          "label": "Mark and submit the ballot"
        },
        {
          "id": "x4",
          "kind": "end",
          "lane": "officials",
          "next": [],
          "uses": [],
          "label": "A scanner or a hand count records it"
        }
      ],
      "title": "Casting a ballot",
      "parent": {
        "map": "m_root",
        "step": "v2"
      }
    },
    "m_canvass": {
      "id": "m_canvass",
      "lanes": [
        {
          "id": "officials",
          "name": "Local election officials",
          "type": "person"
        },
        {
          "id": "parties",
          "name": "Campaigns and observers",
          "type": "person"
        },
        {
          "id": "voter",
          "name": "Voters",
          "type": "person"
        }
      ],
      "steps": [
        {
          "id": "c1",
          "kind": "start",
          "lane": "officials",
          "next": [
            {
              "to": "c2"
            }
          ],
          "uses": [],
          "label": "Match mail-ballot signatures and voter records"
        },
        {
          "id": "c2",
          "kind": "decision",
          "lane": "officials",
          "next": [
            {
              "to": "c3",
              "label": "Yes"
            },
            {
              "to": "c4",
              "label": "No"
            }
          ],
          "uses": [],
          "label": "Is there a problem?"
        },
        {
          "id": "c3",
          "kind": "task",
          "lane": "voter",
          "next": [
            {
              "to": "c4"
            }
          ],
          "uses": [],
          "label": "The voter is contacted to fix it (cure), where allowed"
        },
        {
          "id": "c4",
          "kind": "task",
          "lane": "officials",
          "next": [
            {
              "to": "c5"
            }
          ],
          "uses": [],
          "label": "Add the valid ballots to the count"
        },
        {
          "id": "c5",
          "kind": "end",
          "lane": "parties",
          "next": [],
          "uses": [],
          "label": "Observers from both parties watch the process"
        }
      ],
      "title": "The canvass",
      "parent": {
        "map": "m_root",
        "step": "v5"
      }
    }
  }
}
```
