05 · Contradiction

Not by Checking Answers

The engine holds complete ground truth for every artefact and culture in the world. It could diff a player's beliefs against that truth on every turn and flag every mistake instantly. It deliberately doesn't. A contradiction only exists once a wrong belief produces a consequence something else in the world can visibly catch it on.

Needs Relative vs Absolute Classification, since a contradiction is what fires when a claim conflicts with a property the classifier or the world state actually holds.

The rule the type comment states directly

contradiction.ts's own header names the principle in one line: not all errors are contradictions, only those that produce observable consequences. A player who quietly misattributes one artefact to the wrong culture, and never publishes anything downstream of that mistake, has made an error the system never surfaces. The same misattribution becomes a contradiction the moment it generates a prediction that a later artefact visibly falsifies: a claim that this culture never worked iron, followed by a dig that turns up an iron rivet from that same culture. The engine compares claims against occluded properties, but only reaches for the comparison when a claim has actually staked something falsifiable.

This is the same discipline the visibility model enforces from the other direction: observable and inferable properties can't generate a contradiction on their own, because the player was always free to notice them; only occluded properties, compared against what a claim actually asserted, can.

Eight ways to be caught, not one

Contradiction is a discriminated union of eight members, and the cuts between them are finer than a first pass would guess. MaterialContradiction and MaterialProvenanceContradiction look like the same thing until you notice what each actually targets: the first is about whether a material is present or absent at all (a culture claimed never to use iron, and an iron object turns up), the second is about whether the agent's explanation for a correctly-identified material is right (obsidian correctly spotted, but claimed as a trade import when the world state says there's a local deposit). ProvenanceContradiction is a third, separate cut again: artefact-level context rather than material-level origin.

MemberWhat diverges
materialA material's presence or absence versus what the agent claimed the culture used
temporalAn artefact's provenance versus the agent's asserted chronological ordering
culturalAn artefact's properties versus what the agent's cultural profile predicts
structuralA logical break inside the agent's own inference chain; no new artefact required
provenanceAn artefact's actual origin versus the context the agent attributed it to
corpusThe agent's claim versus published professional consensus, which may itself be wrong
rarityThe agent's sense of how common something is versus the occluded true distribution
material-provenanceA correctly-identified material's claimed origin versus its actual geological source

structural stands apart from the other seven: it needs no new evidence at all, because it's a break inside the agent's own reasoning rather than a mismatch against the world. corpus is the other unusual one: the type comment is explicit that the professional consensus being contradicted may itself be wrong, so resolving a corpus contradiction can legitimately mean challenging the consensus rather than deferring to it.

Queued, not forced

A detected contradiction doesn't interrupt play. It lands in a ContradictionQueue as a QueuedContradiction, carrying a termsUnresolved counter that drives escalating pressure the longer it sits unaddressed, and a surfacedVia field that's absent until the system picks an in-fiction channel to deliver it through: an impossible find, a field report, eventually a pointed letter from a peer or an awkward question from a student. Detection and surfacing are deliberately decoupled, so a contradiction can be sitting there, detected, before the player ever learns about it.

Denial is a supported path, not a failure to resolve

When the player does engage, Resolution.type offers three options, and only one of them is capitulation. revise changes the hypothesis and recalibrates the lens: the honest path. reinterpret keeps the hypothesis intact and explains the evidence away instead, which is legitimate but accumulates HypothesisStrain, a slow-burn pressure that grows more visible the more often it's reached for. reject goes further still and disputes the evidence itself, costing credibility and raising the reputational weight of whatever contradiction surfaces next.

None of the three is coded as the wrong answer. A scholar who reinterprets once is behaving normally; a scholar whose every hypothesis survives by reinterpretation is accumulating strain that eventually becomes its own kind of evidence.

wrong belief, unpublished, no prediction staked never becomes a contradiction wrong belief stakes a falsifiable prediction new evidence falsifies it queued, surfaced diegetically revise reinterpret → strain reject → reputational cost
Only a staked, falsified prediction becomes a queued contradiction. From there, all three resolutions are legitimate; two of them cost something measurable instead of being coded wrong.
Where it lives Spec: docs/06-knowledge-contradiction-model.md §4–5 · Types: src/lib/types/contradiction.ts (Contradiction, Resolution, ContradictionQueue, HypothesisStrain)