# Where was Brunanburh? (battle of 937)

Published report: https://historical-mysteries.netlify.app/brunanburh/report (case page: https://historical-mysteries.netlify.app/brunanburh/)
Local copy: `brunanburh_report.html` (same content).

## In brief (site-facing summary, same shape as the report's opening)
**The battle.** In 937 Anlaf Guthfrithson, the Viking king of Dublin, sailed to join Constantine II, king of Alba (the kingdom that became Scotland), and the king of the Britons of Strathclyde against Æthelstan, grandson of Alfred the Great and the first king to rule the whole of England. The three armies met Æthelstan and his brother Edmund at a place the English called Brunanburh and were beaten; the Norse survivors sailed home to Dublin, Constantine fled north, and Constantine's son, five kings and seven earls were among the dead. A poem in Old English copied into the Anglo-Saxon Chronicle names the field and the water over which the Norse fled, Dingesmere; the Annals of Ulster call it "a great, lamentable and horrible battle".

**Why it is a mystery, and the sides.** No source before the twelfth century says where the battle was; John of Worcester (c. 1095–1140) then wrote that Anlaf's fleet entered the Humber, and every later writer who names a place copies him. No place is called Brunanburh today. Four cases are argued in print: Bromborough on the Wirral (Paul Cavill, Stephen Harding and colleagues at Nottingham; Clare Downham at Liverpool; the Wirral Archaeology finds since 2019), the Humber and south Yorkshire (Michael Wood), Burnswark in Dumfriesshire (Kevin Halloran) and Lanchester in County Durham (Andrew Breeze), with a sceptical position (Tim Clarkson, Thomas Williams) that nothing is settled. Historic England does not list the battle because its register requires a securely located site.

**How the case was judged.** The report reads all 22 medieval texts in the original languages and finds none before John of Worcester locates the battle, and his sentence is a stock formula; tests each candidate's name against Old English grammar (Brunanburh is "Brūna's stronghold", a weak-genitive name, and only Bromborough's spellings descend from it regularly); computes routes and travel times for every army to every site on one basis; and combines the judgements in an explicit evidence model re-run 20,000 times with every factor varied. Result: Bromborough is the leading candidate, at roughly 60% on the weights chosen, with about one in five that the site is a place nobody has proposed and no named rival above 5% at the point estimate. The result is a ranking with a stated uncertainty; it does not identify the site, and the percentages encode a weighting of the evidence rather than any measurement.

## Verdict
- **Bromborough, Wirral: roughly 60%** on the evidence weights chosen (model point 64%; 5–95% of Monte-Carlo draws 36–84%). Every percentage is conditional on the candidate list, the priors and the likelihood ranges in `code/evidence_model.py`; the spread measures sensitivity to those judgements and says nothing about calibration.
- **Some place not yet proposed: about 20%** (9–35%).
- No named rival above 5% at the point estimate: Lancashire coast 4%, Went valley/Burghwallis (Wood 2013) 3.5%, other Humber-bank sites 3%, Burnswark 2%, Brinsworth (Wood 1980) 2%, Lanchester (Breeze) 1%, southern and inland sites 0.2%. In the sensitivity draws the highest any named rival reaches is about 10% (Lancashire coast, 95th percentile); Bromborough ranks first in all 20,000 draws. In the joint worst case (every Bromborough cell at its floor, every rival cell at its ceiling) the Lancashire coast leads at 24% with Bromborough at 2.5%; the joint best case gives Bromborough 98%.
- Status: **Leading candidate.** Bromborough ranks first among several sites that remain possible, and the order can change when one judgement changes. No source locates the battle; the Humber tradition is one formulaic sentence in John of Worcester; the Wirral finds are "consistent with" a mid-Wirral battle and a camp but the diagnostic pieces are almost all without findspots; Historic England has not registered the battlefield (its criteria require secure location).
- The verdict turns on one fact: Bromborough is the only surviving name that regularly descends from OE *Brūnan burh*. Drop that item and Bromborough falls to 24% with "unidentified" at 45%.
- What would overturn it: a sustained demonstration that Bromborough's forms derive from *brūn* "brown" (as Michael Deakin, an independent researcher, has argued); an independent pre-Conquest witness to a Humber landing; a securely located tenth-century battle assemblage elsewhere. What would harden it: gridded re-survey of Bebington Heath with findspots and dated deposits; isotope provenance of the iron to Scotland.
- What is new versus prior scholarship: **This case adds no new primary evidence; everything below is new analysis of old evidence.** (1) What appears to be the first explicit, reproducible probability model of the question, with sensitivity analysis (not independently re-run by anyone yet); (2) route/time computations for every candidate on one basis; (3) a source table checked against diplomatic transcriptions (these are verifications of what the editions and the older literature already contain: "Bellum Brune" is A-text only; Æthelweard's actual wording; the superscript *n* in the Parker MS; Melrose first combines Humber + 615 ships; the Beverley vow story belongs to 934, as Law noted in 1910); (4) an explicit share for "somewhere else". The conclusion **agrees with** the position argued by Cavill, Harding, Jesch, Coates and Downham and cautiously endorsed by Foot, Woolf ("much to commend it") and the Cambridge OE Reader; it does not establish a field consensus (Battlefields Trust: "unlocated"; Clarkson: "distinctly unproven"), and it shifts nothing in the primary evidence.
- What could not be checked: Barbara Yorke's 2026 review (Yorke is a historian of Anglo-Saxon England at the University of Winchester), Halloran 2005, Wood 2013, Deakin 2022/2025, Neil McGuigan's 2014 review of the Casebook in the Scottish Historical Review (McGuigan is a historian of northern Britain before 1300 at the University of St Andrews; his review doubted the Wirral on strategic grounds, since a Scottish king would have marched into a small peninsula hundreds of miles from his own territory) and the Cavill & Harding 2025 book were paywalled or unobtainable (cited via abstracts, extracts and replies); Dodgson PN Cheshire 4 not consulted directly; no manuscript images; no fieldwork; the likelihood ratios are judgements.

## How the report is organised
The page opens with the story of the battle of 937 told for a reader who knows nothing of it, then why the site is unknown and what each side argues, then how the case was judged (evidence, method, result and how sure it is), then the verdict panel with its sensitivity, then a lay-out of the sections: sources, the name, Dingesmere, geography and logistics, the candidates one by one, the evidence model, what would change the answer, what the report adds and what it could not check, where the argument stands, references, files and code. Every chronicle, chronicler, scholar, place and technical term is introduced in a few words at its first mention. Figure 1 (the probability chart) and Figure 2 (the map of sites and routes) were made for the report and are captioned as such, naming in words the model and data they were built from; the scripts that drew them are listed under Figures below.

## Figures
- Figure 1, the probability chart (`data/chart.svg`): drawn by `code/make_chart.py` from `data/evidence_model_output.json`, the output of `code/evidence_model.py` run with 20,000 draws.
- Figure 2, the map of sites and routes (`data/map.svg`): drawn by `code/make_map.py` from the routes in `data/routes_output.csv` (computed by `code/routes.py`) on the Natural Earth 1:50m coastline in `data/british_isles_coast_50m.json`.

## Layout
- `brunanburh_report.html` — the report (self-contained HTML; Google Fonts optional).
- `dossiers/` — the five research dossiers the report was built from:
  - `sources.md` — 22 medieval sources, original language + translation + edition/page/URL, with a summary table and a list of unverified items.
  - `case_wirral.md` — Bromborough: philology, Dingesmere, context, Wirral Archaeology finds and the council assessment, objections.
  - `case_humber.md` — Wood 1980/2013, the Humber tradition and its stemma, other Yorkshire/Lincolnshire candidates, strategy for and against.
  - `case_north_and_others.md` — Burnswark (Neilson, Halloran), Lanchester (Breeze), the full field of c. 45 candidates, Clarkson and Woolf.
  - `debate_status.md` — the debate 2011–2026: Casebook, Livingston 2021, Breeze, Wood, Halloran, Deakin, the finds, Cavill & Harding 2025, official framings.
- `code/` — self-contained; run in order from inside `code/`:
  ```
  python3 routes.py                 # -> routes_output.csv
  python3 evidence_model.py 20000   # -> evidence_model_output.json / .md
  python3 make_chart.py             # -> chart.svg
  python3 make_map.py               # -> map.svg (from data/british_isles_coast_50m.json)
  python3 frag/make_tables.py       # -> frag/table_*.html
  python3 build_report.py           # -> brunanburh_report.html (inlines report.css, SVGs, tables into report_body.html)
  ```
  Pure Python 3, no dependencies. To change a judgement, edit the range in `EVIDENCE` in `evidence_model.py` and re-run.
- `data/` — outputs (`evidence_model_output.json/.md`, `routes_output.csv`, `map.svg`, `chart.svg`) and the Natural Earth coastline.
- `texts/` — extracted texts used for citations: the Wirral Council assessment (`ecc31_full.txt`), Cavill's Casebook essay and 2014/2022/2023 articles, Cavill–Harding–Jesch 2004 on Dingesmere, Grant on Brough, Majorosi, reviews, blog posts; `raw_sources/` holds the downloaded primary-source pages (ASC MSS A–E transcriptions, CELT annals, Annales Cambriae editions, eSawyer); `editions_ocr/` holds archive.org OCR of the Rolls Series editions (John of Worcester, Symeon, Melrose, Howden, Wendover), Skene, SHR 7 (Neilson 1909) and Baring-Gould.
