# Battle Simulator > A hypothetical matchup adjudicator built around client-owned facts. Two contenders, five condition > axes, and a reasoned verdict whose every number is audited back against the stat table it came from. URL: https://battle-simulator.skillsafe.ai/ API: https://battle-simulator.skillsafe.ai/api.html Model: gpt-terra (resolves to gpt-5.6-terra) Source skill: boredhumans battles ## What it does You name two contenders, set the conditions, and get a verdict: what each side actually brings, where the decisive advantage lies, how the engagement most likely goes phase by phase, and what change to the setting would flip it. ## Why it is built the way it is The failure mode of every "who would win" answer is confident nonsense. Ask a language model about a grizzly against a silverback and it will produce bite forces, body masses and sprint speeds with total assurance, and they will be wrong in ways no reader can check. So the numbers do not come from the model. - **A curated stat table ships in the client.** 46 contenders, 205 figures. Animals, historical formations, machines, natural forces, fictional characters, and long-dead individuals. - **The table is passed into the request as fixed input.** The model reasons; it does not supply arithmetic. - **Every figure carries a declared provenance.** `measured` (a direct measurement of real specimens or hardware), `typical_range` (a published field range, where the spread is the fact), `design_spec` (what a maker states, which is not an independent measurement), `historical_estimate` (a scholarly reconstruction, contested by construction), `fictional_canon` (stated inside a work of fiction, and therefore a fact about a text rather than an observation). - **Every number in the reply is checked back against the table afterwards.** A figure that was not supplied is shown to the reader as a finding, with the sentence it appeared in. It is not silently accepted and it is not silently removed. - **Every claim declares how it knows.** Each asset and liability carries `grounded_in`: a supplied stat id, `behaviour`, `setting`, or `reasoned`. A claim marked `reasoned` may not contain a figure. - **A contender outside the table is marked as such.** The verdict is instructed to reason about it qualitatively and state no figures for it, and any number that appears for it anyway is flagged. ## Why the conditions matter An adjudicator that returns the same verdict whatever the setting has failed at the only thing that makes the question interesting. Five axes are modelled explicitly: | Axis | Options | | --- | --- | | Terrain | open plain, dense forest, river shallows, open water, confined space, urban ruins, mountain scree, arctic ice, desert heat | | Light | full daylight, night, heavy fog | | Preparation | no warning, both aware with no time, 24 hours each, side A ambushes, side B ambushes | | Victory condition | incapacitate, drive off, hold ground for ten minutes, first decisive blow, take and hold an objective | | Scale | one of each, as actually fielded | Each option carries explicit trait lists. Before any request is made, the client resolves them against each contender's traits into what the setting **amplifies**, **nullifies**, **pulls both ways**, and what it makes structurally impossible. That resolved profile is what the model reasons from, so changing the terrain changes the input rather than only the wording. Two structural findings are kept distinct because they mean opposite things: a contender that **cannot be present** (a gorilla cannot swim, so open water has no matchup in it) and a contender the **victory condition cannot bind** (a tornado cannot be driven off, because there is nothing in it to persuade). ## Shapes | Shape | What it does | | --- | --- | | `adjudicate` | The first verdict. | | `rematch` | The same pair under changed conditions, returning the delta — including an honest "the verdict did not move" when the change was not decisive. | | `challenge` | You dispute a point. The verdict concedes, partly concedes, or holds its position and says why. An objection that is a preference rather than an error does not move it. | ## What it will not do - **No matchups between named living individuals.** Historical formations and long-dead figures are fine. A person who might be alive, a public figure identified by an office they currently hold, or someone in your own life is not a contender. Enforced in the browser before any request is made. - **No operational detail for causing harm.** The analysis stays at the level of capability and tactics, never method. - **No gore.** Violence is described at the level of outcome, not injury. - **No children in the contender slot, and no help arranging a real fight between real animals.** Every content rule is scoped to the whole output, at every depth, and every rule carries both an input-side test and an output-side drift check. ## Output contract One JSON object: `title`, `matchup`, `conditions_read`, `evidence_basis`, `sides` (two entries, each with `brings`, `liabilities` and `condition_effects`), `decisive_factor`, `likely_course`, `verdict`, `flips`, `not_measured`, `unknowns`. The follow-up shapes add a `delta` block. ## Export Markdown, JSON and a claims CSV — one row per asset, liability, decisive factor and flip, with its declared basis. Every format carries the figure audit, because an export that dropped it would launder the exact thing this app exists to expose. ## Honest limits The stat table is a curated subset of the world, not an authority. A figure it does not contain may still be correct. What the audit tells you is not that a number is wrong — it is that you cannot check it against anything, which is the true statement and the one that lets you decide what the verdict is worth. Most of what a good verdict says is reasoning rather than measurement, and the `not_measured` section exists so the model has to say which parts.