# Clacton by-election (13 Aug 2026) — v0.2 pre-poll freeze

**Version tag:** `clacton-2026-0813-v0.2`
**Lineage:** `clacton-2026-0813` (fresh lineage, founded at v0.1 —
`forecasts/byelections/clacton-2026-0813-v0.1.md`). Revision path per
**Am.2** of the v0.1 record: the §10 interim trigger (first published
constituency VI poll, fired 2026-08-03) was ruled **fold into v0.2** —
no v0.1.1 exists; this document is where the poll lands. Am.2's
condition 4 (name-prompt question resolved from the tables by 12 Aug)
is discharged by the dated resolution note of 2026-08-12 in
`CLACTON_POLL2_RULE.md`.
**Formed:** 2026-08-12, before polls open 13 August (pre-poll freeze
per v0.1 §10, June freeze convention: `snapshot_md5` committed
pre-result, row status `frozen`).
**Basis:** the committed model core
`analysis/clacton_0813/clacton_v3_core.py` (v3 parameter set,
deterministic seed 20260731, 5 structural worlds × 500,000 draws =
**2,500,000 weighted samples**), conditioned on poll 1 — Survation /
Mandate Research, telephone, 16–24 July 2026, n=502, published 3 Aug
2026 — under the v3 likelihood (σ_F 6.5 / σ_B 7.5, A4
staleness-adjusted) at **δ_B = +3** (resolved: Binface **name-prompted**
in the VI question; Variant A). No second qualifying poll exists at
freeze (poll watch, 2026-08-12 morning); `CLACTON_POLL2_RULE.md`
remains armed unexecuted through 13 August.
**Reproduction gate (passed 2026-08-12, hard-stop in the emitter):**
δ=+3 posterior medF 68.8 / medB 12.6; δ=0 medF 67.8 / medB 14.0 —
both match the 12 Aug reference to the digit.

**Market-blindness (honesty note):** formed market-blind per Am.2
condition 6 — the sole inputs are the committed core, poll 1 under the
pre-registered rules, and the dated environment facts in §6. No price,
odds page, or implied probability was consulted; prices remain
private-layer post-forecast comparators only. A private-layer position
on related Clacton markets exists; its existence is disclosed here,
its contents excluded (Am.2 condition 6 verbatim carry).

**Convention note (numbers in this document):** central values are the
core's `med`-label convention — **weighted posterior means** (Addendum
1 of the v3 amendment); intervals are **weighted 10–90 quantiles** of
the posterior (genuine 80% credible intervals, superseding v0.1's
hand-specified intervals); band probabilities are posterior sums.
Unlike v0.1 (hand-specified, no simulation), every §1 number below is
machine-derived from the committed core: `simulations = 2500000` in
the row of record.

---

## 1. Scored quantities — v0.2 freeze values

Scoring functions, resolution rules, and void semantics are **unchanged
from Am.1** (v0.1 §1): Winkler-80 interval score + |central − outcome|
diagnostic for S1–S3; multiclass log loss for runner-up identity; log
loss for the winner probability, near-degenerate flag. Contest
interrupted voids everything (v0.1 §6.3).

| # | Quantity | Central | 80% interval | v0.1 was |
|---|----------|---------|--------------|----------|
| S1 | Reform (Farage) share of valid vote | **68.8** | [62.1, 75.7] | 62 [52, 72] |
| S2 | Winning margin, Reform − runner-up (pp) | **56.2** | [44.0, 68.3] | 52 [36, 62] |
| S3 | Turnout (% of electorate) | **31.7** | [26.9, 36.7] | 39 [31, 48] |

Binface share (not separately scored; feeds runner-up identity and the
band probabilities): **12.6** [6.3, 19.2] (v0.1: 8 [3, 16]).

S2 definitional note: computed as F − B, Binface being the runner-up
with probability 0.90 (below); in the ≤10% of cases where another
candidate overtakes Binface, the true margin would be *larger* than
F − B, so the S2 central is conservative in that tail.

S3 is the largest revision in the freeze: the posterior concentrates
on the low-turnout structural worlds (high-Farage readings co-move
with a stayed-home orphan block), pulling the central from 39 to
**31.7** and tightening the interval. The §6 environment facts
(postal issuance ~12.8% of electorate) point the same way and were
not needed to get there.

**Band probabilities (posterior, δ_B = +3):**

| Farage | P | Binface | P | Turnout | P |
|--------|---|---------|---|---------|---|
| F ≥ 70 | 39.9 | B < 10 | 32.1 | T < 28 | 16.5 |
| F 70–80 | 37.5 | B 10–15 | 37.9 | T < 30 | 33.0 |
| F 50–70 | 60.1 | B 15–20 | 22.2 | T ≥ 40 | 1.7 |
| F < 50 | 0.0 | B 15–25 | 28.9 | | |
| F ≥ 56 | 99.5 | B ≥ 25 | 1.2 | | |

Model-space inversion diagnostic: **P(B > F) = 0.00** (no posterior
mass on Binface outpolling Farage; the electoral-upset probability in
§2 is priced *above* the model for the named non-model channels).

**CRPS rider (Am.1 pin, restated):** the pinned scores are the
interval scores above. v0.2's posterior is fully reproducible from the
committed core + this document, so CRPS **may supplement** the pinned
scores at settlement — never replace them.

## 2. Winner probability

P(Reform hold) = **99.0** unconditional; the ledger-scoreable form is
**P(hold | contest completes) = 99.0/99.7 = 99.3** (void semantics
unchanged from Am.1).

The v0.1 §6.1 update criterion has **fired** — the poll puts one
challenger clearly clear of the pack (Binface 20 vs Fox 2) — and is
executed here with the movement running **down**, 1.7 → **0.7**,
because the same instrument that confirms the focal challenger also
measures the consolidation ceiling:

1. **Focal runner-up confirmed:** Binface is the anti-Farage focal
   point (20 vs next-best 2). The §6.1 precondition (does a focal
   challenger emerge?) is no longer uncertainty to price.
2. **Consolidation ceiling measured, and it loses:** the forced-choice
   head-to-head — the full-consolidation endpoint the 1.7% was
   guarding against, measured directly — is Farage 69 / Binface 31.
   Complete coordination behind the focal candidate still loses by
   38 pp. The June consolidation lesson (challenger share
   systematically underestimated) is a *share* lesson and is priced
   in medB and the B bands; it does not reach the winner at these
   distances.
3. **Headline dominance:** 73 sits 11 above the v0.1 central, at the
   old interval top; posterior P(F < 50) = 0.0, P(B > F) = 0.00.
4. **Scandal salience is in-sample:** the poll's own £5m-transfer
   battery (Q4–Q6) shows the adverse narrative already circulating
   during fieldwork; 73 is measured *with* that drag, not before it.

The residual **0.7** prices what the poll cannot close: fieldwork
20–28 days stale by polling day, a final-24h shock converting scandal
compression into a cascade (window nearly shut — ~10k postal ballots
issued and largely banked, §6), and irreducible 34-way count weirdness.
Contest interrupted stays **0.3** (structural; unchanged — the §6
slow-count expectation affects declaration timing and rejected papers,
not completion).

**Scenario decomposition** (primary-driver buckets; posterior-derived
where the definition is computable, hand-priced where not, marked):

| Scenario | P | v0.1 | Basis |
|----------|---|------|-------|
| A. Canter (no shock; F ≥ 56) | 92.7 | 70 | residual; posterior P(F ≥ 56) = 99.5 bounds it |
| B. Scandal compression (late shock, F 45–56) | 2.0 | 15 | hand: shock window ~1 day, postals banked |
| C. Protest consolidation (B > 18, margin < 40) | 4.3 | 13 | posterior P(B > 18 ∧ M < 40) = 4.3 |
| D. Electoral upset | 0.7 | 1.7 | §2 above |
| E. Contest interrupted | 0.3 | 0.3 | unchanged |

**Runner-up identity** (multiclass, hand-specified, poll-informed):
P(Binface) **0.90**, P(Fox/Reclaim) 0.045, P(Clouston/SDP) 0.02,
P(Stevens/Rejoin EU) 0.015, P(any other candidate) 0.02. Basis: the
measured 18 pp gap to the next candidate; posterior P(B < 5) = 5.5 is
the displacement channel, and displacement additionally requires a
single other candidate concentrating.

## 3. Candidate-level forecast

Farage and Binface rows are posterior objects; the remaining rows
hand-apportion the posterior's residual others mass (100 − 68.8 −
12.6 = **18.6**), poll-informed (published Fox 2, all others 5
combined — the model deliberately retains more others mass than the
poll shows; see §5):

| Candidate | Party | P(win) | Share central | 80% interval |
|-----------|-------|--------|---------------|--------------|
| Nigel Farage | Reform UK | 99.0 | 68.8 | [62.1, 75.7] |
| Count Binface | Count Binface Party | 0.4 | 12.6 | [6.3, 19.2] |
| Laurence Fox | Reclaim | 0.1 | 3.0 | [1, 7] |
| William Clouston | SDP | 0.05 | 2.5 | [0.5, 5.5] |
| John Stevens | Rejoin EU | 0.05 | 2.0 | [0.5, 5] |
| Rest of field (29 candidates) | — | 0.1 | 11.1 | [5.5, 18] |
| Contest interrupted | — | 0.3 | — | — |

Centrals sum to 100; win probabilities sum to 100 (electoral upset
0.7 split with Binface dominant per the §2 mechanism).

## 4. Turnout map — posterior-conditional (Variant A, SELECTED)

**Definitional note:** the v0.1-stage map was **prior-based**
(structural worlds, pre-poll). This map is **posterior-based** —
P(band | turnout bin) under the poll-1 posterior at the resolved
δ_B = +3. Emitter:
`analysis/clacton_0813/clacton_v02_prepoll_map.py` (imports the
committed core; reproduction-gated); output of record:
`analysis/clacton_0813/clacton_v02_prepoll_map_2026-08-12.txt` (both
variants; the δ_B = 0 counterfactual is emitted alongside and NOT
selected). Bins in % of electorate, lower-inclusive; columns are
conditional on the bin; P(bin) is unconditional.

| T bin | P(bin) | medF | P(F≥70) | P(F50–70) | medB | P(B<10) | P(B15–25) |
|-------|--------|------|---------|-----------|------|---------|-----------|
| <28 | 16.5 | 73.2 | 72.9 | 27.1 | 9.1 | 61.7 | 9.0 |
| 28–30 | 16.5 | 70.7 | 55.7 | 44.3 | 10.9 | 44.3 | 16.8 |
| 30–34 | 39.7 | 68.6 | 37.2 | 62.8 | 12.7 | 28.5 | 28.5 |
| 34–38 | 22.2 | 65.9 | 17.1 | 82.9 | 15.0 | 14.0 | 45.4 |
| 38–40 | 3.6 | 63.6 | 4.3 | 95.7 | 17.0 | 6.0 | 60.0 |
| ≥40 | 1.7 | 61.5 | 0.4 | 99.4 | 18.7 | 2.8 | 67.6 |

Reading: turnout is the share lever — every 4 pp of extra turnout
costs Farage ~2.5 pp of share and hands Binface ~2 pp, because the
marginal voter comes disproportionately from the orphaned 2024
major-party block. Count-night turnout will be knowable hours before
shares; this map is the pre-committed translation.

## 5. Known tension — carried, per the v3 closure clause

Posterior medB **12.6** sits well below Survation's published **20**
(and medF 68.8 below the published 73; the posterior retains others
mass of 18.6 against a published 7). The literal 73/20 remains
reachable only via the novelty-inflow tail. Recorded and left standing
at v0.1's Am.2, the v3 amendment, and now the freeze — resolution is
settlement's job, not this document's.

**Exceedance, stated plainly (2026-08-12, pre-merge addition):** the
comparable-basis published Binface headline — **20.32** (Table_V2,
registered extraction basis) — sits **above the frozen 80% interval
top**: B [6.3, 19.2]. That is more than a point outside, and the
exceedance is upward. This is the same standard Am.2 applied to
Farage's 73 against v0.1's [52, 72], applied in the other direction:
at this freeze the published Farage 73 falls *inside* the frozen S1
interval [62.1, 75.7]; the Binface exceedance is the one that does
not, and it is stated here as an exceedance, not folded into the
median tension above. The frozen interval is the posterior's — the
model deliberately discounts the poll's concentration under the v3
likelihood — and it is scored as frozen on the 14th, exceedance and
all.

## 6. Environment facts (dated, sourced; recorded, not modelled-in)

- **Postal issuance ~10,000** (Tendring returning officer, 8 Aug
  2026) ≈ 12.8% of the 78,245 GE2024 electorate — low for this
  constituency and consistent with, but not an input to, the S3
  revision (§1).
- **Ballot paper ~1 metre long, 34 candidates; elevated rejected
  papers and a slow count expected** (ITV News, 7 Aug 2026). Bears on
  the valid-vote denominator (the core's 1.02 ballots-per-valid-vote
  gross-up in T) and declaration timing (count night is a manual
  session per the runway), not on completion risk (E unchanged, §2).
- **Electorate ~80k implied** by issuance-round reporting vs 78,245
  at GE2024. **Declared figures govern** settlement wherever they
  differ from any figure here.

## 7. Row of record

`byelection_forecasts`, model_version `clacton-2026-0813-v0.2`,
status **`frozen`**, `frozen` TRUE, `frozen_at` pinned
2026-08-12T11:30:00+00:00, as_of 2026-08-12, simulations 2,500,000,
real election_date 2026-08-13. Append-only: the v0.1 row (id 14)
stands untouched; display and edge read the latest non-superseded
row. Migration:
`supabase/migrations/20260812113000_clacton_0813_v02_prepoll_freeze.sql`,
**applied to the live database 2026-08-12 in the freeze session**
(freeze precedes polls regardless of merge timing — the June
convention; committed-but-unapplied is a banked failure class) and
verified by selecting the row back; the verification record is in the
freeze-session report.

**`snapshot_md5` (June convention, committed pre-result):** MD5 of
the canonical serialization (`model/calibration/snapshot_hash.py`) of
the frozen row as read back from the live database:

```
contest_id    clacton-2026-08-13
snapshot_md5  cb3ee7fca30665a6c96ad2976860ba63
```

Computed 2026-08-12 from the row as **selected back from the live
database** (id 15) after applying the migration — the system of
record, not the migration file.

At settlement, `calibration_ledger.snapshot_md5` must equal this
committed value and the recomputed live-row hash — any mismatch is
tamper-evidence, not a rounding note. `clacton-2026-0813-v0.2` is
added to `FROZEN_MODEL_VERSIONS` in `snapshot_hash.py` in this PR
(`--verify` reports it NOT IN LEDGER until the 14 Aug scoring session
writes the ledger row — expected pending state, not a failure).

## 8. Artifact manifest (staged-blob SHA-256, blob domain)

Companion artifacts of this freeze, hashed over **committed blob
content** (post-EOL-normalisation — the blob git stores, not the
working tree):

```
dba1ec0bf4bcff561111128d52927b59e5c59f742ae44bdafb00d8ab0705ade7  CLACTON_POLL2_RULE.md
e3a9cd528399dd09b4579ac8afeee7df462c628afa214fc27801ab1428882f7b  analysis/clacton_0813/clacton_v02_prepoll_map.py
61e7a1c68e4c74a736ef15d7464af672a0c6a39a8d43eda88de1a2798d398102  analysis/clacton_0813/clacton_v02_prepoll_map_2026-08-12.txt
5965f0cd592b6e18dd5fc1362d2e7b3f327e0f75d0394e1338ea1663c75f807f  supabase/migrations/20260812113000_clacton_0813_v02_prepoll_freeze.sql
10121fe3b879e58e4f77cca5ccd02aa366cc0c7c389a7f3c289b417342a1fb17  model/calibration/snapshot_hash.py
```

Verification is against **staged/committed blobs** (`git cat-file
blob <rev>:<path> | sha256sum`), never the working tree.

This document itself is anchored by its commit and the annotated tag
**`freeze/clacton-2026-0813-v0.2`** (pushed at freeze). The Survation
tables file is third-party and not committed; its download SHA-256 is
pinned in the 2026-08-12 resolution note in `CLACTON_POLL2_RULE.md`.

## 9. Settlement

Unchanged from Am.1 (v0.1 §1/§10): resolves on the declared result of
the 13 August poll as constituted at the 17 July SOPN; interrupted →
all quantities void; S1–S3 Winkler-80 + central diagnostic, runner-up
multiclass log loss, P(hold | completes) = 99.3 log loss with
near-degenerate flag; scoring lands in `calibration_ledger` (14 Aug
session). The forecast-level gate's event moment
(`FORECAST_LEVEL_GATE_SPEC.md` Addendum 2) takes **this frozen
artifact only** as its basis; post-freeze poll arrivals get a dated
note and change nothing here (the frozen object stands).
