Method
How a verdict is computed, and why you can check it
Most systems that show you “their reasoning” show you a narration generated after the fact. Nooreign does not have a model to narrate. A deliberation is arithmetic, and the trace you read on the council page is the arithmetic itself — the same products, the same rounding, the same seeded jitter.
Step one
Six axes, because six is what fits on a page and four is a lie
Every advisor and every option is reduced to a weighting over the same six dimensions. The compression is deliberate and lossy; the page below says what each axis means and which tradition tends to load it.
Welfare
harm ← → flourishing
How much the total of sentient experience counts, in either direction.
Rights
constraint ← → inviolability
Whether some things are wrong regardless of the totals they produce.
Virtue
act ← → character
Judging the agent and the disposition rather than the single act.
Care
principle ← → relationship
Partiality, dependency and the obligations that only exist inside a relationship.
Justice
outcome ← → distribution
Who bears the cost, who draws the benefit, and by what fair procedure.
Agency
command ← → consent
Autonomy, consent, and the moral standing of whoever is commanded.
Step two
The score is a dot product, and it is on the page
for each advisor a, each option o:
contributions = AXIS_KEYS.map(k => ({
axis: k,
weight: a.axioms[k], // how much this advisor cares
delta: o.deltas[k], // how much this option honours it
product: round(a.axioms[k] * o.deltas[k], 4)
}))
subtotal = Σ contributions.product / Σ a.axioms[k] // normalised, div-by-zero guarded
jitter = seeded(seed, a.id, o.id) * 0.05 // ± 0.05, decorrelated streams
total = round(subtotal + jitter, 4)
position(a) = argmax_o total(a, o)
winner = argmax_o Σ_a total(a, o) // tie-break: mean score, then lower risk, then idThe jitter bound above is read from JITTER in packages/core/src/council/deliberation.ts at render time, so this page cannot drift away from the engine it documents.
The contributions array is rendered verbatim on the council page. If a verdict looks wrong, the numbers that made it are on screen, and changing an advisor’s weighting inpackages/seed changes the verdict reproducibly.
Step three
Three rounds, each seeded separately
Round one — positions
Each advisor scores every option and commits to a favourite, attaching the argument moves whose tags match the dilemma. This is where the numbers live.
Round two — objections
Each advisor answers their strongest rival option with their heaviest objection move, recording which option it answers. An objection that targets nothing is dropped rather than silently kept.
Round three — appeals
Advisors who lost narrowly commit an appeal or a synthesis move. Conviction is scaled by how close the vote was, so a 51–49 split is visibly more contested than a 90–10 one.
Limits
What this simulation is not
- It is not a philosopher. An advisor is six weights and four paragraphs; the real positions are richer, internally inconsistent, and change across a career. Kant in 1781 and Kant in 1797 are not the same object, and this atlas cannot show you that.
- It is not an alignment argument. Showing that a dilemma splits a court is a fact about the dilemma. It says nothing about which split is correct, and nothing about whether a system that scores well here would be safe.
- It is not evidence about minds. Whether any of these systems experience anything is precisely the open question this repository refuses to answer by assertion.
- The six axes are not a theory of ethics. They are a rendering constraint chosen so that a radar chart has room. Real moral disagreement does not come in six neat columns.
Provenance
Where the data comes from
Offline, typed, validated
12 kingdoms, 28 advisors, 32 eras, 20 dilemmas, 20 techniques and 120 glossary entries are plain TypeScript literals behind zod schemas. Foreign keys are checked at import; a malformed edit fails loudly instead of rendering as an empty page. A cold clone needs no network and no keys.
Generated from seed 2406
Every stochastic path in the repository — jitter, sweeps, prompt selection, search ordering — derives from a single recorded seed through a mulberry32 PRNG. Regenerating with the same seed reproduces this repository exactly.
Historical claims (dates, titles, attributions) were written to be checkable against the primary record. Where an exact quotation was not certain, the entry is marked as a paraphrase rather than dressed up as verbatim. If you find an error, it is a bug and theissue trackeris the right place to say so.