Numbers and words¶
Frontier
This is work in progress. It ran, and what it found is below with its limits. It is not a receipt: there is no kit you can run on your own machine, and the code is not public. We show it so you can see where the work is going and judge it for yourself.
In short. A company files a report every quarter: numbers in its tables, and words in its management's discussion of them. We asked a narrow question. Over time, do the words and the numbers move together, or do they part? And if they part, can the record itself say when?
What we did¶
We took one small public company's filings from the SEC's public archive: 33 original quarterly and annual reports from September 2018 to August 2026. Amendments were left out on purpose. From each filing we kept two things:
- the numbers: eleven balance-sheet values, exactly as filed;
- the words: the management discussion section, paragraph by paragraph.
Then we asked: given everything the company had filed before, how well do this filing's words predict this filing's numbers? If that fit holds steady and then suddenly breaks, the break has a date.
Before reading any date, we ran a forgery test. We shifted the words by one filing, so each report's words sat beside the next report's numbers. If the instrument can't tell that forgery from the real pairing, it has no business giving a date, and it doesn't.
What we found¶
| reading | forgery test | date |
|---|---|---|
| the instrument as first published | failed | none: it could not see the words |
| the instrument as rebuilt (October 2026) | passed | none: the words and numbers did not demonstrably part |
So, for this one company, over these 22 scored filings: no date. The words and the numbers did not part in a way the record can show.
Building it taught us more than the answer did:
- The first version of the instrument could not see words on real filings at all. It had only ever been demonstrated on idealised test data. We found that out because the forgery test failed. That is what the test is for.
- Three fixes were needed, each set down before the result it governs was read: measure the words on their own scale, reduce them to as many directions as there are numbers, and date the break on ranks rather than raw sizes.
- Two of our own early baselines were wrong, and we replaced them before reading anything. Both are named in the code.
What it does not tell you¶
- It is one company. Twenty-two filings is a small record.
- It reads balance-sheet values only, and original filings only.
- "No date" means the record does not show a parting. It does not mean the words are accurate, and it says nothing about intent or cause.
- A second way of reading the filings (only the paragraphs new since the last report) had too little to go on at this size. It is not a reading of this company.
- You cannot recompute this yourself. It needs our code and a pinned language model. Building a kit is listed as a job to do, not done.
A preview of the scripts¶
The work runs as two scripts. They are not public; this shows what they do and how they are run.
# 1. Read the declared filings from the raw SEC files into one paired record (numbers beside words).
python scripts/extract_pairing_sec.py --declaration pairings/sec-fdctech.declaration.json \
--raw <folder of SEC files> --out <trace.npz>
# 2. Read the pairing, with the forgery test first and the order control beside it.
python scripts/read_pairing.py --trace <trace.npz> --raw <folder of SEC files> --out <reading.json> \
--instrument whitened --project --ranks --forge-first 1.0
The first script refuses, naming the filing, when a declared value or section is missing. It never fills a gap. The second reports the forgery test first and computes a date only if that test passes. Beside the date it reports the same filings in 100 random orders. A date means something only if random orders mostly give none.
For the technically minded
- Source: sec.gov and data.sec.gov; 49 requests, each response's SHA-256 kept.
- Numbers: 11 values from the company facts, asinh-transformed. Words: each paragraph of 40 characters or more, embedded by all-mpnet-base-v2 at a pinned revision, averaged per filing.
- Instrument: a held-out, regularised regression from words to numbers, with its regularisation scaled to the words' own spread, and an exact leave-one-out baseline over each filing's own prior filings. The words are reduced by a fixed random projection to k = 11. The date is a two-segment split on ranks against 300 order permutations, at a threshold of 3.0 times the baseline's own spread. Seed 20260611.
- Forgery test: rule declared before the run (a mean change of at least 1.0 times the baseline's spread). Observed 2.76.
- Checked on planted couplings: a break placed at filing 70 of 120 was dated in 4 of 5 seeds; with no break, no date in 5 of 5.