11 Possible contradictions
This chapter is about the one kind of drift the rest of the sweep can’t see: two engrams that say opposite things, with nothing in the archive connecting them. It explains the check that looks for those pairs, what it does with them and how to switch it on.
Nobody contradicts themselves on purpose, and an archive doesn’t either. Say the agent picks up one thing in March and hears the opposite in October; the October session writes a fresh engram and moves on. Now both are current and both turn up in search, and which one the agent recalls next is down to how you phrase the question. Orwell called it doublethink, holding two beliefs that cancel each other and accepting both, and an archive does it without noticing. The sweep in Chapter 10 finds a retirement somebody started and didn’t finish, because a supersedes link points at an engram still marked stable. When nobody started the retirement, it has nothing to go on: no link, tag or date ties the two engrams together.
11.1 What it is for
The contradiction check reads for meaning: it compares what two engrams say about the same subject, and when a line in one seems to say the opposite of a line in the other, it puts the two lines in front of the agent as a possible contradiction, finding code V302.
The finding says possible because a language model does the reading, and models misread things (a negation that isn’t there, a line that’s really the exception to the other one). The model can’t see time either, so “an order arrives by Friday” and “an order takes two weeks” read as a contradiction, and both can be true, one before the shop changed its distributor and one after. So a finding is a question, never a verdict: the check doesn’t pick the true line and keeps its hands off the engrams.
It’s the agent’s question, since the engrams are its own knowledge. A finding is the agent noticing that two things it learned disagree and bringing that to you, the way a colleague stops by your desk: you told me two things about this, which one still holds? You answer, and the agent edits its own knowledge to match.
11.2 How it works
The check picks pairs of engrams that talk about the same subject, then compares their observation lines one by one, and only lines about the same thing reach the model. Not every engram takes part, and not every pair:
- Engrams with the status draft, proposed, idea or poc stay out, as do retired engrams and any engram past the end of its validity window.
- Two engrams whose validity windows never overlap are never compared, because they were never true at the same time.
- The check compares engrams within one domain only, so a line in
booksthat contradicts a line inshopsis never found. - German and English both work, and so does a line that mixes the two.
There’s no cloud in the loop: the model downloads once and runs on your machine, and your lines never leave it.
You get at most one finding per pair of engrams, quoting the two lines that disagree most strongly, naming both engrams and saying how many more line pairs between the same two engrams read the same way.
The daemon does the reading in the background: after a change lands and its embeddings are computed, it reads the new pairs and stores what it found, so by the time anybody asks for a sweep the work is done and the sweep only picks up the stored results. Right after you switch the check on, the first sweep says how many pairs aren’t scored yet, and the count goes down as the daemon works through them.
11.3 Three answers to one question
Which edit fits depends on the story behind the two lines, and you know the story (the agent mostly guesses). When one of them is false going forward, the agent retires it: it supersedes the engram the way Chapter 10 retires a fact that stopped holding, or it takes the stale line out when the rest of its engram still holds. When both are true, one the exception to the other, it acknowledges the pair and the sweep stops asking about those two lines. When each held at a different time, the newer engram supersedes the older one, whose window closes at the real date it stopped holding, and that takes the pair out of the check, since a retired engram is never compared.
On the first of the month maintenance is due, so you start the morning with a sweep (Fluid shows the same kind of queue, Figure 3.2), and it turns up all three:
You: Anything from the sweep?
Agent: The mechanical findings are done (two links). Three
possible contradictions need you. Each time I learned two
things at different times that disagree:
1. books: "Standing preorders" still says to preorder every
new Vickers once it's announced. "Vickers: wait for the
reviews" says to wait. When "buy on sight" retired, that
line was missed and nothing links the two: take Vickers
off the preorders?
2. books: "Wait for the paperback" says no hardbacks. "The
collector's shelf" (the exception moved there when
collecting got an engram of its own) says a book that earned
its place gets the hardback. I read that as the exception
to the rule, both true: acknowledge the pair?
3. shops: "Capsule Corp Books: by Friday" says a book ordered on
Monday is in the shop by Friday. "Capsule Corp Books: ordering
in" says two weeks since the distributor changed in March.
Both held, one after the other: supersede the first with
the second, its window closed at the end of February?
You: Yes to all three. Note on the hardbacks: only after the ebook,
that's the point of the shelf.
Agent: Done. Vickers is off the preorders. The hardback pair is
acknowledged ("the collector's exception, after the ebook").
The Friday engram is superseded by the ordering-in one, its
window closed on 28 February, and its Friday line is
acknowledged as expired with it, since it no longer holds.
The agent found the three pairs, read both engrams of each, worked out what it thought had happened and proposed one edit per pair. You didn’t open a single engram, you answered three questions about your own life, the kind only you can answer: whether Vickers still belongs on the preorders, whether the shelf rule still counts, when the shop slowed down. Then the agent changed its own knowledge to match, and the next sweep doesn’t raise those three pairs again.
Before the check, nothing in the sweep would ever have raised the Vickers pair. You watched “buy on sight” get superseded in Chapter 10, four parts and all, with the old notes kept as provenance. The preorder list was a different engram, though, with no link to the retired rule, so no structural rule had anything to fire on, and for months a question about the next Vickers could have ended in a preorder, until the check turned up the line the supersession had left behind.
Your agent keeps two engrams about Capsule Corp Books in shops. The old one says a book ordered on a Monday is on the shelf by Friday. Then a Tessier-Ashpool paperback took two weeks (the shop had switched distributors) and the agent wrote that down too, in a second engram. Nobody connected the two, so when you ask whether the new Doctorow will be there for the weekend, your agent recalls the Friday engram and says yes, and on Saturday the shelf is empty.
Once the pair has come up in a sweep and you’ve told your agent that the Friday promise ended with the old distributor, the newer engram supersedes the Friday one, whose window closes the day the distributor changed. A week later you ask again, and this time the answer comes from the newer engram (two weeks, so order now if you want it for the weekend after next).
11.4 Turning it on
The check is off until you switch it on, and leaving it off is a fine choice, because it isn’t free: the first time it runs it downloads its model, about 550 MB. While it’s reading, the model takes a lot of memory: about 2.6 GB on an ordinary CPU and about the same on Apple Silicon. The daemon unloads it again when there’s nothing left to read, so most of the day the check costs disk space and nothing else.
On a small machine (a Raspberry Pi, a laptop already short of memory) leave it off. The same goes for a domain too young to have drifted, since a few weeks of knowledge rarely disagrees with itself. Turn it on once the archive has a year or two and a lot of forgotten sessions behind it.
You switch it on by asking the agent, and it changes the setting with its configure tool:
You: Turn on the contradiction check.
Agent: Switched on (evolve.contradictions full). It applies now: the
daemon downloads the model on its first pass, then reads the
related pairs in the background. The next sweep tells you how
many are still waiting.
The setting is evolve.contradictions, off by default or full, and it takes effect at once, no restart needed (Chapter 23 has the entry). From a terminal it’s crystalline config set evolve.contradictions full, and its environment twin is CRYSTALLINE_EVOLVE_CONTRADICTIONS. Switching back to off deletes the stored scores on the daemon’s next pass. crystalline status and crystalline doctor show the setting, the model, the device it runs on and how many pairs are still waiting; when the model couldn’t be loaded, they say why, and setting the value again retries. A line pair counts as a finding at a contradiction probability of 0.95 or more, read in both orders. The check needs the default local embedding model, which is what picks the related pairs and lines; with any other embedding model the sweep says in one line that V302 doesn’t run. The answer to a finding is an ordinary edit: a supersession (with the old valid_to set to the real date when the two held in turn), a correction of the stale line or an evolve_ack of V302 with a note, set through edit_engram like every acknowledgment. A valid_to that has passed under a live status is a finding of its own (V001), so the agent changes the status in the same edit. An acknowledgment covers exactly the two lines it was given, so a new disagreement between the same two engrams still surfaces (Chapter 26 has the full V302 entry). On a shared Postgres database, two instances never score the same virtual domain at once: one takes it, and the other finds the pairs already scored.
The contradiction check finds two current engrams in one domain whose lines seem to say opposite things, the drift no link or date gives away. A finding, V302, is a question and never a verdict: the model can be wrong and can’t see time, so the agent brings the pair to you and you decide. The agent retires or corrects the engram that’s false going forward and acknowledges a pair where one line is the exception to the other. When both held at different times, the newer engram supersedes the older one, its window closed at the real date. The check is off by default, runs locally in the background after each change and costs a one-time download of about 550 MB and a few GB of memory while it reads.