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.
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.
| Member | What diverges |
|---|---|
material | A material's presence or absence versus what the agent claimed the culture used |
temporal | An artefact's provenance versus the agent's asserted chronological ordering |
cultural | An artefact's properties versus what the agent's cultural profile predicts |
structural | A logical break inside the agent's own inference chain; no new artefact required |
provenance | An artefact's actual origin versus the context the agent attributed it to |
corpus | The agent's claim versus published professional consensus, which may itself be wrong |
rarity | The agent's sense of how common something is versus the occluded true distribution |
material-provenance | A 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.
docs/06-knowledge-contradiction-model.md §4–5 · Types: src/lib/types/contradiction.ts (Contradiction, Resolution, ContradictionQueue, HypothesisStrain)