# Reconciliation

Many parties say things about one event: its producer, sources CastHQ
watches, members, agents. Each statement is a **claim**. CastHQ never
overwrites a claim and never deletes one; it picks which claim each fact
shows, records the pick as a **change**, and keeps the rest visible.

## Claims

A claim asserts one fact (`schedule`, `status`, `title`, `location`,
`links`) about one event, with:

- an **origin**, from the claimant's standing on that event, not from who
  they are in general: `producer` (the party the event belongs to),
  `observed` (a witness: a watched source, a member, an agent without
  standing) or `admin` (CastHQ, ruling on a conflict);
- the time it was observed;
- optionally an evidence link (`source_url`) and the hash of the page
  CastHQ fetched and read;
- optionally the claim it supersedes: a party correcting itself.

Claims are append-only. A correction is a new claim.

## Picking the winner

For each fact, among the claims nobody has superseded, the winner is the
first by:

1. **origin**: `admin` over `producer` over `observed`;
2. then **recency**: the most recently observed;
3. then the claimant's own stated confidence, which only breaks ties within
   one origin at one instant.

A weaker origin never outranks a stronger one, however recent or however
many say it. The winner's value is what every surface shows, and moving it
writes one change, in the same transaction as the claim. A claim that loses
writes no change of its own, but can open a dispute (below) and can move
the fact's [confidence](/confidence).

## Precision

A date is a window with a precision (`datetime`, `day`, `month`, `quarter`,
`half`, `season`, `year`, `window`, `tba`), never a made-up day. A schedule
change is classified as `scheduled` (a first date), `moved_earlier`,
`moved_later`, `narrowed` (the window shrank inside the old one), `widened`
or `undated`, and carries `delta` in seconds. Surfaces never state a date
more precise than its precision.

## Disputes

A party **disputes** a fact when its latest claim:

- differs from the value shown,
- comes from a different party than the winner (a party revising itself is
  a correction, not a dispute),
- is not superseded, and
- carries an http(s) evidence link.

When a party starts disputing, CastHQ writes a `dispute` change with
semantic `opened`; when it stops (it came round, it won, or a new winner
agrees with it), `resolved`. A party already disputing that changes its
value is still one dispute. While a dispute is open and CastHQ has not
ruled, the fact's confidence is `disputed`. An `admin` ruling settles it.

Open disputes are listed as `contested` on the status answer. Never present
a contested value as the date.

## Confirmation, in words

The status answer says, for each fact, who the shown value rests on:

| `confirmation` | The winning claim |
|---|---|
| `producer_confirmed` | the producer's |
| `admin_ruled` | CastHQ's ruling |
| `observed` | a watched source's |
| `community_reported` | a member's, with no watched source |
| `unclaimed` | nobody's: the registry's default |

Say which when repeating a value: "confirmed by the producer", or
"reported by {source}, not confirmed by the producer".

## Guarantees

- Every change is ordered: the feed cursor never skips a committed change.
- Every change names the claim that caused it, with its provenance, and can
  be verified against CastHQ's published keys.
- The same claims give the same winner, the same changes and the same
  confidence. Rules that could move a level are versioned, and a rule
  change that moves one is itself recorded as a change.
