The Enron Brain
How we built the pages, where a person made the call, and how we checked every fact against its email. Every number on this page comes straight from the build.
A page holds a median of 83 facts and at most 7,587. Of the published facts, 19,528 expire. On 175 pages, Enron's relationship with the organization changes over time. Dynegy, for example, goes from trading counterparty to agreed acquirer in November 2001, and then to adversary.
The build ran in four steps. The first three ran on Claude Opus 5. Opus 5.5 launched before the fourth, and with no reason not to use the latest model, we ran the fourth on it.
1. Find the types. The model read a random sample of 3,200 messages and proposed the kinds of entities the company deals with. We gave it 22 generic starting types, such as customers, suppliers, competitors, regulators and media, because most companies have customers and competitors and many deal with regulators and the press. It proposed 57: 21 of our seeds and 36 of its own. With a real customer, we'd also ask for types of their own, then learn which of the generic, supplied and discovered types matter to them.
2. Find the entities. The same pass named the entities in each message. We merged aliases by rule, then with the model, which folded three spellings of Enron North America into one entity, and counted every name across all 45,047 messages. An organization named in at least 25 messages became a candidate for a page, and the review described below narrowed the list.
3. Build a page. The model read every message naming the entity and returned facts, each quoting the sentence it came from. We checked every quote against its message and merged facts that repeated. A closing pass wrote the summary, the relationship phases and the section order. Neither the merge nor the closing pass can drop a fact: the merge must cite every fact it was given, and the closing pass has no field for returning facts at all.
4. Verify. A newer model read every fact beside the messages it cites and kept it, rewrote it to say only what the mail says, or dropped it. A name, title or acronym expansion may come from another message dated on or before the fact, which the fact then cites. Nothing may come from what the model knows. The model then rewrote the summary and phases so each claim cites facts on the page. After the third audit, we revised the phases once more so every part of a label holds from its start date.
We developed the method on eight mailboxes (dasovich-j, steffes-j, shackleton-s, taylor-m, kaminski-v, buy-r, farmer-d, germany-c) and built every page here from eight others (kean-s, mann-k, jones-t, kitchen-l, beck-s, sanders-r, williams-w3, lenhart-m). The two sets share 129 of 3,200 sampled messages, 4.0 percent. We left out shapiro-r, which fit the mix of roles but shared 16.4 percent. Each set spans an executive office, corporate legal, litigation, trading operations and two traders, much like a small company with diverse roles. The corpus holds about 150 mailboxes; testing on eight kept the cost down.
Here is everything the test mail could have influenced.
Three times, each with the kind of input a customer gives when setting up a brain. A person kept 54 of the 57 proposed types, cutting named legislation, hotels and venues, and restaurants and bars. A person chose which classes get pages: organizations and five parts of Enron itself, not products, facilities or events (see Browse by what it is). A person cut 30 entity names that a text search can't pin to one organization, such as California, Risk, Williams and PG. They're listed without a page.
No one edited a page or any extracted facts. The only changes to the model's text are mechanical: British spellings made American, dates put in US format (January 21, 2000), and em dashes replaced with commas, because AI writing overuses them. Quotes from the mail appear exactly as written, except that we mask phone numbers and credentials everywhere, by pattern, as described under The corpus.
Of 62,205 candidate facts, 37 quoted a sentence we couldn't find in the message, and we discarded them. A quote that matches proves the sentence exists. It doesn't prove the statement says only what the sentence says, and the model has read a great deal about Enron. That makes Enron an unusually hard test. It's one of the most written-about companies in the world, while the customers, suppliers and projects in a typical company's brain get little coverage, so a model has far less of its own to add. We measured whether each statement stays within its mail separately, with a different model, Claude Fable 5.1, as the judge, on 500 facts drawn at random each time, and on the summary and phases of every page.
| Before verification | After pass 1 | After pass 2 | |
|---|---|---|---|
| Facts fully supported by their mail | 392 of 500 | 459 of 500 | 466 of 500 |
| Facts with one detail the mail doesn't state | 108 | 40 | 34 |
| Of those, the detail matches the public record, not the mail | 27 | 13 | 8 |
| Facts whose core the mail doesn't support | 0 | 1 | 0 |
| Summary claims supported | 861 of 931 | 933 of 936 | 1,054 of 1,065 |
| Phases supported | 479 of 541 | 525 of 535 | 515 of 540 |
Each audit drew its own 500 facts. The summary and phase rows count every page, so they move as pages change, and the third audit has one page fewer because one was later dropped. The summary claim count rose more than the text did because the judge splits each summary into claims itself. The first two audits gave it 54 pages at a time and the third one page at a time, and it split more finely: the 161 summaries unchanged since the second audit went from 692 claims to 793.
Verification rewrote 16,046 facts in its first pass and 5,714 in its second, and dropped 541, most of them about a different organization with a similar name. 3,343 facts cite an earlier message for a name or acronym.
What's left is small. In the last sample, no fact was wrong at its core, but about one in 15 had one detail a careful reviewer would soften, such as a surname added to a first name, a verb a shade stronger than the mail's, or a quote credited to the wrong speaker. The summary and phase checks cover the same pages verification saw, so they aren't held out.
In the third audit, 25 of 540 phases failed. We split compound labels, which is why there are more phases now, and moved start dates to the first fact that shows them. The same judge, with the same instructions for phases, then passed 580 of 591.
A person graded 50 of the third audit's fact verdicts blind and agreed with 48. In both disagreements, the excerpt of the message missed the quoted sentence, because of the bug described next. Re-judged against the full message, both facts are supported.
A bug in our tooling showed some facts an excerpt of their message that missed the quoted sentence. The search for the quote needed an exact match, and failed when the quote's line breaks fell differently from the message's. In the audits it hit 47 facts: 14, 16 and 17 in the three samples. We fixed the search and re-judged those facts with the same judge and instructions. The table shows the corrected counts, and audit.json keeps each first verdict. The same bug hit about 6 percent of facts in each verification pass. Those facts were rewritten and dropped more often than the rest, so its measured effect was to cut detail. We didn't re-run verification on them, because changing facts after the third audit would leave it measuring pages that no longer ship. The audits judge the published facts, these included.
We publish every verdict from all three audits and the phase re-check, with the judge's reason: audit.json. Neither check can tell whether a message was right. A fact here is what the mail said.
At Opus 5 list prices, building the pages would cost $8,857. We ran it on a Claude subscription and totaled that figure from the run's own token usage: 64 million tokens written and 9.5 billion read from cache. Reading the mail was $7,311, merging $1,312 and the closing pass $233. That's 37 cents a message read, 18 cents a fact and $41 a page, before the batch discount, which halves it. Type discovery and alias merging ran separately on the API and aren't included.
Checking the pages ran on the same subscription and would cost $2,358 at list prices: $1,727 for verification on Opus 5.5, $165 for the summary and phase fixes, and $466 for the audits on Fable 5.1. Building and checking together come to $11,215. We made no attempt to bring that down, and used neither the batch discount nor a smaller model.
Reading is most of the bill, so we compared models on it: one entity, Calpine, 17 batches, the same prompt, one call to the model per batch, and every quote checked the same way.
| Model | Facts found | Quotes not in the message | Cost for 17 batches |
|---|---|---|---|
| Haiku 4.5 | 198 | 13.9% | $0.46 |
| Sonnet 5 | 368 | 3.4% | $4.96 |
| Opus 5 | 376 | 1.3% | $4.35 |
Costs are each run's recorded tokens at list price. Haiku costs a tenth as much but finds about half the facts, and the quote check discards its misquotes. Sonnet cost more than Opus here because it wrote four times as much, including four retries of one batch that ran past the length limit.
This is the Carnegie Mellon release of the Enron email, which FERC made public during its investigation. We removed duplicates by subject, timestamp and sender, leaving 45,047 messages. The people who wrote it didn't choose to publish it, so the pages are about organizations. We publish the data behind each page beside it as <entity>.json.
We replace two things with XXXX wherever they appear: the last four digits of every phone number, and the value after a password, passcode, PIN, username, user ID, login, participant code or access code label. That covers everything we publish: the model's text, the quotes, the message excerpts and subject lines, and the data files. We mask after the quote check, so we checked every quote against the original message. The masking works by pattern, so a number or credential written in a form the patterns don't recognize could remain. Names and email addresses appear as they do in the corpus.