Luke Simmons

Aotearoa Research: mapping New Zealand's policy challenges as a cited graph

Author’s note: this post was drafted by Claude (Anthropic) from my project notes and the project’s methodology document, then reviewed and edited by me before publishing. The voice and judgments are mine; the typing isn’t.

The problem with policy writing

Most writing about a country’s problems is prose, and prose hides its own gaps. A paragraph can assert that housing is unaffordable in a region, blame it on three things, and gesture at a solution — all without a single citation, and without any way to tell which sentence is load-bearing and which is filler. You can’t query it. You can’t check it. You can’t tell, six months later, whether a figure was sourced or invented.

Aotearoa Research is my attempt to build the opposite of that: a structured, fully-cited account of New Zealand’s policy challenges across all 16 regions, where the structure is the point and nothing gets to be vague.

A graph, not an essay

The corpus is a typed directed graph. Instead of paragraphs, it’s made of small typed entities — each one a YAML file validated against a JSON Schema — joined by typed edges. As of this quarter there are 3,855 of these entities across the 16 regional councils and a national layer on top.

The entity types are deliberately specific:

And they’re wired together by 18 kinds of edge: a problem is driven_by drivers; a claim is evidenced_by a source; a camp addresses a problem and tensions_with a rival camp. The reason to model it this way rather than write essays is that it forces you to separate things prose lets you blur — the harm from its cause, the cause from the argument about it, the argument from the evidence underneath it. You can’t accidentally smuggle an opinion into a fact, because facts and opinions are different node types.

It also means the thing is queryable. Because every problem links to its drivers, camps and claims, I can ask the corpus questions — which regions share a driver, which claims a camp rests on, where the evidence is thinnest — instead of re-reading it.

The part I actually care about: you can’t make things up

The structure would be worthless if the content were unverifiable, so the honesty discipline is built into the schema and enforced by a lint gate.

Every claim carries two explicit fields. Confidence — high, medium, low, or disputed — says how sure the claim is. Verification status says how the claim was checked: verified, needs_verification, or cited_only. I’m honest about where the corpus currently sits: most claims are cited_only — cross-checked against domain knowledge and attached to a source, but not yet run back to the primary document line by line. The field exists precisely so I can’t pretend otherwise.

Then there’s the gate. Eighteen cross-entity rules run every time the corpus is rendered, as Python predicates over the whole graph. Two of them are the ones that matter most, and both are hard errors that block the build:

That second rule is the whole project in one line. If I write a number and don’t attach where it came from, the site won’t build. It is genuinely harder to add an unsupported claim than to do it properly, which is exactly the incentive I wanted.

Sixteen regions, one schema

The corpus covers all 16 regional councils across 11 themes — housing, transport, infrastructure, environment, inequality, crime, health, education, economy, governance, and climate adaptation. Every region is authored against the same schema and passes the same gate, which is what makes them comparable: an Auckland claim and an Otago claim are the same kind of object, scoped to their region, so a comparison between them means something.

On top of the regions sits a national Pattern layer. A pattern is a structure that recurs across regions — it has to manifest in at least two of them to exist — and it rolls up the regional claims that evidence it. That’s how the project gets from sixteen separate regional pictures to national findings without inventing a separate “national” dataset: the patterns are projections over what’s already there.

Building it region by region surfaced its own honesty problem, which I’ll mention because it’s the kind of thing this structure is good at catching: in an early pass, several regions had been filled with near-identical boilerplate claims — structurally valid, semantically empty. The lint gate passed them (they were well-formed and cited), but a read-through didn’t. That gap — between “passes the schema” and “actually says something” — is the one thing the machine can’t check, and it’s where the editorial work lives.

What’s next

The honest roadmap is about closing the gap between cited_only and verified: a primary-source pass that walks each claim back to its document. Beyond that, the corpus has an iwi/rohe spatial axis that’s modelled but only warning-enforced, and a long-tail idea of exporting the whole graph as JSON-LD so it’s machine-readable by anything, not just this site.

But the core is done and it does the thing I set out to do. It’s a large body of research about a country that you can interrogate, check, and disagree with — where every figure has to show its working, and the build won’t let me cheat.

— Luke Simmons, Auckland

← All posts Projects →