The Filing Room
Intelligence product data layer
Case study · Working paper

Everyone can read the filings. Almost nobody joins them.

The disclosure that governs institutional money is public, free, and almost entirely unusable in the form it is published. This paper argues that the durable advantage for an intelligence product is not another feed. It is the join, the clock, and the receipt: linking every record that describes the same institution, remembering both when a fact was true and when we learned it, and keeping the source document behind every number.

87
public and semi‑public sources catalogued for this paper
78
confirmed reachable at the URL and terms recorded
17
separate identifier systems the same institution and its holdings appear under
2
closed by statute, the walls no effort or money opens
Audience anyone who builds on public filings Offers a wish list, in section 14: a phased sequence a small team could start Reading time about 20 minutes Status case study and wish list, not a report on work done
01 The argument in one page #

If you read nothing else, read the six claims below. Each one is falsifiable, each one is defended later in the paper, and each one has a cost attached in section 13.

01
The raw data is a commodity. Treating it as the product is the common failure.
Anyone with a script can pull Form 5500, 13F and N‑PORT, the core US retirement‑plan, manager‑holdings and fund disclosures, and the UK register. The filings are free and the parsers are a solved problem. A business built on having the files is a business with no moat.
02
The scarce asset is the join, and the join is genuinely hard.
A single pension plan appears as an EIN, an employer tax number, in the Department of Labor filings, a CIK, a filer number, at the SEC, an LEI, the global legal entity identifier, in the swap data, a PSR number at the UK regulator, and a free‑text string in a board minute. Nothing in the public record links them. Reconstructing that link is the work.
03
Time is the second axis, and it is the one that gets skipped.
A filing describes a quarter that ended months ago, is amended a year later, and is superseded twice after that. A store that keeps only the current value cannot answer what was known on a given date, which is the only question that matters when someone challenges a call.
04
Confidence has to be earned from agreement, not asserted by a model.
A language model asked how sure it is will tell you ninety percent and be wrong. Sampling the same question several times and measuring how often the answers agree produces a number that tracks reality. This is a design decision, and it is cheap.
05
Human expertise belongs on the residue, not on the pipeline.
Machines should carry the volume and hand up only the cases they cannot settle. An expert who adjudicates a thousand hard cases a year is worth more than one who re‑keys a hundred thousand easy ones, and the adjudications become training data.
06
The output is not a number. It is a number with a filing behind it.
Institutional buyers do not pay for an assertion. They pay for an assertion they can defend to a committee. That means every value carries its source document, its accession, its retrieval time and the disagreement it beat.
What this paper is A design argument for a data layer we have not built yet, written so that, if anyone builds it, the expensive decisions get made deliberately rather than by accident in month four.
What it is not A status report. Nothing described here is running. Every claim about the outside world is checkable; everything about the architecture is a wish list, not a capability.
The honest headline The architecture below is more expensive up front than the obvious alternative and cheaper after roughly eighteen months. If the horizon is shorter than that, the obvious alternative wins and this paper is wrong.
02 Where the alpha is #

A useful way to decide what to build is to ask, for each layer of the stack, how long a competent competitor would need to reproduce it from scratch. Layers that take a fortnight are commodity no matter how much they cost us. Layers that take years are the business.

The estimates below are deliberately unkind to ourselves. They assume the competitor is good, has money, and knows what they are doing. What survives that test is worth funding.

The word alpha Borrowed from investing, where alpha is return above the market. Here it means the same thing for a business: the part of the work that produces an advantage a competitor cannot quickly copy.
How to read the bar The bar is time‑to‑replicate, not time‑to‑build. Short bars are things we still have to do; they are just not things anyone will pay a premium for.
Fetching the filingscommodity
Public endpoints, documented rate limits, stable formats. A capable engineer covers the major sources in a month.
~1 month
Parsing themcommodity
Well‑specified XML and XBRL schemas, the machine‑readable tagging formats regulators mandate, with published taxonomies. Tedious, bounded, and largely solved by open libraries.
~2 months
Breadth of coveragenear commodity
Knowing which 87 sources exist is worth something, but it is knowledge, and knowledge leaks. Assume a rival reaches parity in a year.
~1 year
The entity joindefensible
Linking 17 identifier systems and a long tail of free text into one institution, with the borderline cases adjudicated and recorded. Every correction makes the next one cheaper, so the gap widens rather than closes.
3 yrs plus
Bitemporal historydefensible
You cannot backfill what you did not record. A competitor starting in 2027 can buy today's data but can never reconstruct what was believed in 2026, because nobody kept it.
not purchasable
Adjudicated conflictsdefensible
A growing corpus of resolved disagreements between sources, each with the reasoning attached. This is proprietary judgement and it compounds.
3 yrs plus
The interfacecommodity, and that is fine
Whatever people query it with will be rewritten twice. Build it thin, and never let it own logic that belongs in the data layer.
weeks
The conclusion this drives. Spend engineering time in proportion to the bar, not in proportion to the visible output. The fetchers and parsers should be boring, uniform and cheap to add. The join, the clock and the record of judgement deserve the senior attention, the schema design and the review discipline.

This is an uncomfortable allocation, because the commodity layers are the ones that demo well. A new source lights up a dashboard. A better resolution threshold does not. The discipline is to keep funding the invisible half.

The counter‑argument Breadth is what customers ask for in the first meeting. A data layer with perfect lineage over four sources loses a bake‑off to a shallow one covering forty. Both have to happen, which is why section 14 sequences them rather than choosing.
Why the gap widens Resolution improves with adjudicated examples, and examples accumulate with runtime. A rival can copy the architecture in a quarter and still be three years behind on the thing the architecture exists to accumulate.
03 The shape of the problem #

Start with a question a client would actually ask. Which UK local authority pension funds changed their emerging markets equity manager in the last two years, and what were they paying the outgoing one?

Every word of that question is answerable from public documents. None of it is answerable from any single public document. The answer lives across a committee report published as a PDF on a council website, an annual report filed months later, a regulatory return in a different format under a different identifier, and a manager’s own disclosure that names the mandate but not the client.

So the work is not retrieval. The work is assembly, and assembly across sources that were never designed to be assembled has four specific failure modes.

Why this question It is representative rather than exotic: multi‑source, multi‑jurisdiction, time‑bounded, and worth money to the person asking.
Failure one

The same institution has many names and no shared key

A fund is an EIN to the Department of Labor, a CIK to the SEC, an LEI to the derivatives reporting regime, a registration number to the UK regulator, and a slightly different string in every document a human typed. Merge on name and you will merge two different funds; refuse to merge and you will report the same fund twice.

Failure two

Sources disagree, and the disagreement is information

Two filings give different values for the same holding on the same date. One is late, one is amended, one uses a different valuation convention. Picking a winner silently throws away the most valuable signal on the page, which is that a discrepancy exists at all.

Failure three

Everything arrives late, and out of order

Quarterly holdings appear forty‑five days after quarter end. Annual returns appear seven months after year end and are amended for years afterwards. A store with one timestamp cannot distinguish “this was true then” from “we learned this then”.

Failure four

Ranking multiplies error unless it is calibrated

Any system that produces a best answer from conflicting inputs is running a ranking function, whether or not anyone designed one. If that function has no calibrated notion of source authority, errors do not cancel. They compound, quietly, in the direction of whichever source happens to be loudest.

None of this is novel. The academic literature on truth discovery, the problem of deciding what is true when sources of unequal reliability disagree, has spent fifteen years on exactly this, and the finding is consistent: systems that model source reliability explicitly outperform majority voting, and systems that emit calibrated probabilities outperform systems that emit confident single answers. Google’s Knowledge Vault work is the best‑known industrial version of the same result.

The design in the rest of this paper is an attempt to take that finding seriously rather than rediscovering it in production.

The defect is not that a system gets an answer wrong. The defect is that it is silent about having had a choice. The single design principle behind sections 07 to 11
Checkable The truth‑discovery result is public literature, not our assertion. It is the reason section 09 ranks by calibrated source authority instead of by recency or by majority.
Where this could be wrong If in practice sources rarely disagree on the fields users care about, the machinery in sections 08 and 09 is overhead. That is measurable early and cheaply, and section 14 puts the measurement before the spend.
04 The source register #

Before designing anything, we catalogued the ground. 87 sources across the US federal system, US states, the UK, entity registries, market data and macroeconomic series. For each one we recorded what it actually contains, how it is obtained, what keys it carries, and the one thing about it that will bite an engineer who assumes it behaves normally.

78 were confirmed reachable at the terms described. 9 are recorded from documentation rather than fetched: eight because they are paid, gated, licensed or restricted in redistribution, and we did not buy past the terms, and one, the Australian holdings disclosure, free but assessed from secondary sources. 5 rows are marked as walls: 3 commercial, where access is sold or licensed rather than published, and 2, the PBGC (the US pension insurer) event filings and SEC Form PF, closed by statute, where no amount of effort or money helps. The walls are marked, not hidden, because a register that only lists what is easy is a sales document rather than a plan.

Open any row for the field notes. Filter by category or availability, or type to search across every field. Everything in this section is data, not prose: the counters above and in the opening are computed from these rows when the page loads.

Why the gotcha column exists Almost every schedule overrun in data work comes from a source behaving in a documented but unexpected way. Writing the surprise down before the estimate is the cheapest risk control available.
What the register is worth Roughly a year of a rival’s time, and no more. It is knowledge, and knowledge walks. We treat it as a head start, not as the moat.
05 The join graph #

Here is the map that makes the case better than any argument. Seventeen identifier systems, one institution. An identifier system is simply the numbering scheme a regulator or registry uses to name the entities it tracks; each was designed alone, for its own purpose, and none was designed to line up with the others. Solid lines are joins a machine can make from a published crosswalk, a table that translates one scheme into another. Dashed lines are joins that have to be inferred, defended, and occasionally corrected by a human.

Notice where the dashed lines cluster. The Legal Entity Identifier is the closest thing to a hub and it works well for banks, listed issuers and UK companies. It does almost nothing for the American private retirement world, which is precisely the part of the market an intelligence product in this space most needs to cover.

The load‑bearing gap There is no authoritative public crosswalk from an employer identification number to an SEC filer number, only partial self‑reported bridges. Everything downstream of that gap is inference. Any vendor claiming clean coverage across both worlds is either resolving probabilistically or quietly guessing.
EINDOL and IRS EIN + PNplan level ACK_IDone filing CIKSEC EDGAR CRDSEC and FINRA RSSDFederal Reserve NAIC cocodestate insurance LEI GLEIF, global partial coverage CRNCompanies House FRNFCA register Charity no.England and Wales PSR numberPensions Regulator FDIC / NCUAUS banks, credit unions FIGI / CUSIP / ISIN instrument, not entity no public crosswalk filer metadata Form ADV FFIEC NIC partial only GLEIF registration id firm reference dual registration only name match only partial, via Fed hierarchy issuer LEI
published crosswalk, machine joinable inferred join, needs scoring and review Seventeen systems shown as fourteen nodes; the three instrument identifiers are grouped, as are the two depository identifiers.
IdentifierIssued byCoversJoin quality
EINUS Internal Revenue ServiceAny US employer or sponsorReliable within the retirement world, isolated outside it
EIN + PNUS Department of LaborA specific plan under a sponsorThe true grain of a US plan, and it is a composite key
ACK_IDEFAST2, the DOL filing systemOne submitted filingExact, and the only stable handle on an amendment chain
CIKUS SECAnything that files with the SECExact within EDGAR, no bridge to plan filings
CRDSEC and FINRAAdvisers and broker dealersExact, and joins to CIK through adviser filings
LEIGLEIFLegal entities that opted in or were required toExcellent where present, absent for most plans
RSSDUS Federal ReserveBanks and holding companiesExact, with a published crosswalk to LEI
FDIC certUS FDICInsured depositoriesExact, joins through the Fed hierarchy
NCUA charterUS NCUACredit unionsExact, separate universe from the bank identifiers
NAIC cocodeUS state insurance regulatorsInsurersExact within insurance, weakly linked outward
CRNUK Companies HouseUK incorporated entitiesExcellent, and the anchor for most UK joins
Charity numberUK Charity CommissionRegistered charitiesJoins to CRN only when an entity is dual registered
FRNUK FCARegulated firmsExact, and the register carries the company number
PSR numberUK Pensions RegulatorOccupational schemesOften present only as a name in public documents
FIGIOpenFIGIInstrumentsOpen and free, the practical default
CUSIPCUSIP Global ServicesNorth American instrumentsLicensed, and the licensing is a real constraint
ISINNational numbering agenciesInstruments internationallyWidely present in filings, joins cleanly to FIGI
06 How this data goes wrong #

Architecture arguments are easy to wave away. Specific misbehaviour is not. Six examples from the register, each of which breaks a naive pipeline in a different way, and each of which the design in sections 07 to 11 exists to absorb.

Provenance Each of these came out of reading the source documentation and the published files, not out of a vendor brochure. The corresponding register rows carry the detail.
Studied, not hypothetical The first row has a literature. Ljungqvist, Malloy and Marston (Rewriting History, Journal of Finance, 2009) compared successive downloads of the same I/B/E/S analyst records and found that between 1.6% and 21.7% of matched records differed from one download to the next, through in‑place changes, additions, deletions and anonymised analyst names.
What happensWhy it breaks a simple pipelineWhat absorbs it
Prior years are rewritten The annual retirement filing datasets regenerate every plan year, not just the current one. A file you loaded last quarter can change underneath you with no version marker. Content hashing at ingest, plus a record of when we knew each version
Amendments arrive for years A single filing can be superseded repeatedly. Keying on the sponsor and the year silently overwrites history; keying on the submission produces duplicates unless the chain is modelled. Filing level keys and an explicit supersession relation
Legally confidential fields Some regimes permit an issuer to withhold specific holdings while filing everything else. The absence is lawful and permanent, so retrying is waste and imputing is misrepresentation. A first class “withheld by right” state, distinct from missing
The best content is a PDF Committee papers naming a manager appointment are scanned documents on a council website with no consistent structure, no feed and no identifier. Document extraction with confidence, then adjudication of the uncertain band
Names drift constantly The same institution appears with different punctuation, legal suffixes, historic trading names and simple typing errors, across documents that never share a key. Blocking on similarity, scoring the pair, and reviewing the middle
Conventions differ quietly Two sources report the same holding on the same date at different values because one uses a different valuation or reporting convention. Neither is wrong and neither says so. Keeping both, ranking by source authority, publishing the disagreement

The common thread is that none of these are bugs in the sources. They are the sources working as designed, under legal and administrative constraints that will not change because we find them inconvenient. A data layer either models them or is quietly wrong about them.

The cheap alternative Overwrite on every load and accept the loss. It works, it ships in weeks, and it is the right call for a prototype. It cannot answer “what did we believe in March”, which is the question that arrives with the first client dispute.
87 sources filings, PDFs, APIs, registers Bronze · 07 bytes as served content-hashed Silver · 08 typed, validated two clocks Gold · 09 one institution ranked, decided Answer · 11 value with its receipt Quarantine rejects, with reasons Expert loop · 10 uncertain band only fetch + hash parse + contract resolve + rank publish fails contract replayed after fix escalated decision, recorded
Sections 07 to 11, in one picture. Machines carry every filing left to right. The two chambers underneath are where the pipeline admits what it could not settle: records that fail their contract wait in quarantine with the reason attached, and the uncertain band of the entity join goes to a person whose decision is recorded and fed back. Nothing is silently dropped, and nothing reaches the answer without a receipt.
CS Case study: a production database, examined #

Section 06 lists the ways this data goes wrong in theory. We do not need to speculate about what happens when years of it are absorbed without the architecture in this paper, because a production database that grew for years alongside an editorial product is that experiment, already run. Every observation below comes directly from the live schema, examined in August 2026. The exact figures are deliberately withheld; the patterns are the point.

This is not an audit of editorial quality; the margin shows the editorial discipline is real. What the observations show is missing is structure: provenance, a time axis, first‑class states for “unknown”, and entity resolution. These are exactly the gaps the design in sections 07 to 11 exists to close.

What is healthy No exact duplicate names anywhere in a large investor file. Derived investor summaries recompute without a single mismatch. A deep history of fund‑size snapshot pairs holds no conflicts. The cascade and validation hooks hold. The gaps below are architectural, not carelessness.
Why it matters commercially Exercising the store’s conversational interface, an MCP service that lets AI assistants query it directly, showed that a meaningful share of its answers could not be trusted. A store where a large share of the activity rows are invisible drafts and no value carries a source cannot support an agent that has to decide which of two conflicting numbers to trust. The ceiling is the store, not the model.
Unseen
a large share of story activities are drafts, invisible to every API and MCP consumer
Unsound
many allocation snapshots fail their own arithmetic; some are empty entirely
Undated
most stories carry no period date; the valid‑time axis is simply absent
Doubled
near‑duplicate name groups across investors and managers, split by punctuation, spacing or suffix alone
Observed, liveWhat it meansThe layer that absorbs it
A large share of story activities are drafts sitting under published stories The served API and the MCP see only part of the activity record, and nothing marks a published story as having invisible activity underneath it. This alone plausibly explains much of why the interface’s answers could not be trusted. Contracts and quarantine (08): the gap becomes a measured reject rate instead of a silence
Near‑duplicate name groups across investors and managers One foundation exists twice, split by a curly versus a straight apostrophe. One manager carries a double space in its name. Another appears with and without its corporate suffix. Each split entity halves its own history. Blocking, scoring, adjudication (09, 10)
No provenance model, anywhere No source, verified‑by, confidence or correction field exists in any collection. Documents are attached to stories in bulk, and to no investors and no funds. The authors table is empty. Bronze evidence plus the provenance payload (07, 11)
Period date empty on most stories; a handful of allocation snapshots dated years into the future Most of the record cannot answer “when was this true”, and nothing rejects a date from the future. Two clocks, plus contract range checks (08)
“No AUM” stored as a plain zero on a meaningful share of investors Zero, unknown and undisclosed are three different facts stored as one value, and the legacy undisclosed sentinel was collapsed into NULL in activity sizes. First‑class withheld and unknown states (06, 08)
LEI empty across the entire investor file The join graph in section 05 is aspiration, not present state: today the database reaches the outside world by name string only. Entity resolution against the register (09)

The point of this case study is not embarrassment; nothing here is unusual for an editorial product that grew a database. The point is that phase A in section 14 does not have to wait for new sources. The cheapest overlapping corpus is usually already in the building: an existing investor list, joined against Form 5500 and Companies House, measures the disagreement rate and the uncertain band on exactly the data users already rely on.

Method Plain SQL against the production schema, repeatable by anyone with read access. The observations are point‑in‑time and will drift, and the exact figures are deliberately withheld here. The queries, not the numbers, are the artefact.
07 Bronze: keep the evidence #

The first layer has exactly one job, and the discipline is in refusing to give it a second. Bronze stores what the source served, unaltered, addressed by the hash of its own content, with the retrieval circumstances recorded alongside it.

No cleaning. No renaming. No dropping of fields we do not currently use. The moment bronze starts improving things, the thing it exists to be, a faithful record of what was published, stops being true, and every downstream claim about provenance becomes an approximation.

Why bronze, silver, gold The names come from the medallion pattern (see references): three layers, each refining the last. Bronze keeps the raw evidence, silver turns it into validated records with a time axis, gold merges them into one answer per institution.
Why hash addressing Two loads of an unchanged file collapse to one row automatically, and a changed file is impossible to miss. Deduplication and change detection fall out of the same decision.
Layer one
Bronze
Immutable. Append only. The thing you show someone who does not believe you.
1Store the bytes, not an interpretation. The original payload lands as received. If the source publishes something odd, bronze contains something odd, and that is correct.
2Address by content hash. The identity of a document is what it contains. Re‑fetching an unchanged file is free and idempotent.
3Record the circumstances. URL, retrieval time, response headers, the terms it was obtained under, and which run produced it.
4Never update, never delete. Corrections arrive as new rows. The history of what a source said is itself a dataset.
!The rule that will be tested. Someone will want to fix a malformed field at ingest because it is easier there. Refusing that, every time, is what makes the rest of the paper work.
Consequence

Reprocessing is free

Every parsing decision downstream can be revised and replayed against the original evidence, without going back to a source that may no longer serve it.

Consequence

Disputes are settleable

When a client challenges a figure, the answer is the document, retrieved at a stated time, not a recollection of what a pipeline did.

Consequence

Sources can disappear

Endpoints are withdrawn and reorganised routinely. What we captured while it was live remains, which is quietly one of the more valuable properties here.

08 Silver: two clocks #

This is the section where the architecture earns or loses its keep. Silver turns raw documents into typed records, and it does so on two independent time axes: when something was true in the world, and when we came to know it.

Those are different, they routinely disagree by months, and collapsing them is the single most common irreversible mistake in financial data engineering. Irreversible because the information is not lost in storage, it is never captured. A system that records only the current value cannot be upgraded later into one that remembers.

Concretely: a holding is reported as of the thirty‑first of March, published in mid May, amended the following February. Ask on the first of June what that position was, and the honest answer is the May figure, because the amendment did not exist yet. A single‑clock store answers with the February number and cannot tell you it has done so.

The two clocks Valid time is the period the fact describes.
Transaction time is the period we believed it.
Both are intervals, not instants, and both need to be queryable.
Now standard, not exotic PostgreSQL 18 supports temporal primary keys and foreign keys directly, so the constraint that stops two versions of a fact overlapping in time is enforced by the database rather than by application discipline. This used to be the reason teams skipped bitemporality. That reason has expired. PostgreSQL 19, now in beta, documents temporal tables as a standard chapter of the manual. The valid‑time half is native; the transaction‑time half remains the exclusion constraint below.
What it costs Roughly two to three times the rows, more careful queries, and a genuine learning curve for anyone who has not worked this way. Real, and in our view worth it.
Layer two
Silver
Typed, validated, bitemporal, and honest about what it rejected.
1Every record carries both intervals. Valid time and transaction time, enforced so that no two versions of the same fact claim the same instant.
2Contracts gate entry. A record that fails its schema, its ranges or its referential checks does not enter silver.
3Rejects are quarantined, not dropped. Failures land in a holding area with the reason attached. A silent drop rate is an unmeasured coverage gap.
4Corrections supersede, they do not overwrite. An amendment closes the previous belief interval and opens a new one. The old belief stays queryable forever.
!What this buys. Point in time reconstruction, honest backtests, and a defensible answer to “what did you know, and when”. Nothing else in the stack can provide these retrospectively.
-- the shape that makes it enforceable rather than aspirational CREATE TABLE holding ( entity_id uuid NOT NULL, instrument text NOT NULL, quantity numeric NOT NULL, source_id text NOT NULL, -- which filing said so valid_time daterange NOT NULL, -- when it was true known_time tstzrange NOT NULL, -- when we believed it -- one fact, two clocks, per source: a source cannot hold two -- overlapping beliefs at once; sources may still disagree EXCLUDE USING gist ( entity_id WITH =, instrument WITH =, source_id WITH =, valid_time WITH &&, known_time WITH && ) -- needs the btree_gist extension ); -- "as of" is then a query, not a rebuild: SELECT * FROM holding WHERE valid_time @> '2026-03-31'::date AND known_time @> '2026-06-01'::timestamptz;
valid time: the date both figures describe believed from 9 Feb 2027, still open £1.291bn, amended £1.284bn, the reported figure believed from 14 May 2026 until superseded on 9 Feb 2027 asked on 1 Jun 2026 answer: £1.284bn, because the amendment does not exist yet 31 Mar 2026 14 May 1 Jun 9 Feb 2027 time →
The worked example from the prose, drawn. Both bars describe the same 31 March position: one valid time, two beliefs. A single‑clock store keeps only the top bar and answers the June question with a figure from the future. The bitemporal store keeps both, so “what did we believe on 1 June” lands on the bar that was open that day.
A distinction worth getting exactly right. Overlap prevention with exclusion constraints has existed since PostgreSQL 9.0 in 2010, with the range types this pattern uses following in 9.2, and plenty of teams have built bitemporal stores on it. What is new is that the temporal keys and foreign keys are now part of the standard table definition, which moves the guarantee from convention into the schema. The capability is not new. The cost of the capability has dropped a great deal.
09 Gold: resolve and rank #

Gold answers two questions that silver deliberately leaves open. Which of these records describe the same institution, and where they disagree, which value do we publish and how sure are we.

Resolution, in three passes

Comparing every record against every other is quadratic and pointless, so the work is staged. Block to reduce candidate pairs using cheap similarity: trigram matching on names, which compares overlapping three‑letter fragments so spelling variants still match, and vector search on embedded descriptions, which compares meaning rather than spelling. Both of these the database can index. Score the surviving pairs with a probabilistic record linkage model that learns field weights from the data rather than from a hand‑written rule set. Adjudicate only the band in the middle, where the score is neither confidently a match nor confidently not.

Most pairs never reach the third pass, which is the point. The expensive judgement is spent where it changes an outcome.

Ranking, by earned authority

When two sources give different answers, the winner is decided by a tiered authority model: a primary regulatory filing outranks a regulatory summary, which outranks an entity registry, which outranks a market feed, which outranks a document a human wrote. The tiers are recorded, applied consistently, and revisable when evidence says they are wrong.

The loser is not deleted. It is published alongside, as a recorded disagreement, because a client who can see that two regulators differ is better served than one handed a clean number that hides it.

Tooling, honestly The mature open library here is Splink: Fellegi‑Sunter probabilistic linkage, the standard statistical model for deciding whether two records describe the same entity, from the UK Ministry of Justice, MIT‑licensed, v4, run at national‑statistics scale. It supports several compute backends at different levels of maturity, and the Postgres backend is described by its own maintainers as minimally supported. If we run linkage in the database we accept that; if we do not, we accept a second runtime. This is a real trade‑off and we should make it knowingly.
Confidence that means something Ask a language model for its confidence and it will produce a number that is poorly calibrated and habitually overconfident. Ask it the same question several times with randomness left on and measure how often the answers agree, and the agreement rate does track accuracy. We would use the second.
Where a model must not sit A model may propose, score and explain. It must not be the last thing between a value and a client. Structured output, a fixed schema, and a ranking step that a human can read are the difference between assistance and exposure.
Layer three
Gold
One institution, one best answer, and the disagreement it beat.
1Block cheaply. Trigram similarity and vector nearest neighbour cut the candidate space by orders of magnitude before any expensive comparison runs.
2Score probabilistically. Field weights learned from the data, producing a match probability rather than a yes or no.
3Route by confidence. High scores merge automatically, low scores stay separate, and the middle band goes to adjudication.
4Rank by tier, then recency. Authority first, freshness second, and the full ordering kept so a decision can be re‑examined.
!Publish the conflict. Every gold value carries the alternatives it beat and the margin it won by. Silence about disagreement is the defect we are designing against.
10 The expert loop #

There is a version of this kind of product where analysts read filings and type the results into a system. It works, it is how most of this market was built, and it does not scale past the number of analysts you can afford.

There is another version where a model does everything and nobody checks. It scales beautifully and produces a product that cannot be sold to anyone with a compliance function.

The design here is neither. Machines carry the volume and are required to declare when they are unsure. Experts see only the cases that were escalated, and their decisions are captured as labelled examples that make the next round of automation better. The human cost per record falls over time while the quality per record rises, which is the only shape of this kind of business that compounds.

The number that decides it The escalation rate. Too high and this is a manual business with extra steps. Too low and the thresholds are lying. Instrument it from day one, because it is the single figure that tells you whether the loop is working.
The compounding part Every adjudication is a labelled hard case. Hard cases are the expensive training data that nobody can buy, and a competitor starting later starts with none of them.
deterministic ~82% probabilistic ~12% model‑adjudicated ~5% expert ~1% Design target, not a measurement. The escalation rate is what verifies it.
Tier one · machine

Deterministic rules

Exact identifier matches, published crosswalks, arithmetic checks. Effectively free, no judgement involved, and it should handle the large majority of records.

Tier two · machine

Probabilistic scoring

Learned field weights over blocked candidate pairs. Cheap, fast, and produces a calibrated score rather than a verdict.

Tier three · assisted

Model adjudication

Only the uncertain band. The model reads the surrounding context, answers in a fixed schema, and reports agreement across repeated samples as its confidence.

Tier four · human

Expert decision

What survives all three. A domain specialist decides, the reasoning is recorded, and the case is added to the evaluation set that keeps the tiers below honest.

The organisational implication, stated plainly. This design changes what a team hires for. It needs fewer people who process records and more people who can settle a genuinely ambiguous case and explain why. That is a smaller team, a more senior one, and a harder one to recruit. It belongs in the wish list’s fine print rather than discovered in a budget.
11 An answer that survives being checked #

Everything above exists to make one thing possible: handing a client a figure that holds up when their own analyst goes looking for it.

That is a higher bar than accuracy. An accurate number with no provenance is worth very little to an institution, because the person receiving it cannot put their name on it. A number with the filing behind it, the retrieval time, the competing values and the reason this one won, is something a professional can defend in a meeting. That is the product.

The vocabulary for expressing this is a settled standard rather than something we need to invent: W3C PROV. Entity, activity, agent, and derivation relations between them are enough to state exactly where a value came from and what happened to it on the way.

Test for the whole design Pick any published number. Can we produce the document, the moment it was retrieved, the rule that transformed it, the alternatives it beat, and who or what decided? If not, the layer below is incomplete.
// what a single published value would carry { "value": "1,284,000,000", "field": "total_plan_assets", "entity": { "resolved_id": "…", "confidence": 0.97, "method": "exact_key" }, "valid_time": "[2025-01-01, 2026-01-01)", // the period described "known_time": "[2026-07-14T09:12Z, )", // since when we believed it "source": { "tier": 1, // primary regulatory filing "document": "…", "retrieved": "2026-07-14T09:12Z", "content_hash": "sha256:…" }, "contested_by": [ { "value": "1,291,400,000", "tier": 3, "note": "registry summary, stale" } ], "decided_by": "rank:source_tier", "reviewed_by": null // set when a human adjudicated }
Because of bronze

The document is retrievable

Not a link that may rot, but the bytes as served, with the hash that proves they have not changed since.

Because of silver

The clock is answerable

Both intervals are on the record, so an as‑of question is a query rather than an archaeology project.

Because of gold

The disagreement is visible

The competing value is shown with its tier and the reason it lost, so the client sees the judgement rather than only its result.

12 Running it for years #

A data layer is not a project that finishes. Sources change format without notice, endpoints move, regulators revise schemas, and a pipeline that was correct in March is quietly wrong in September. The operational design matters as much as the schema design.

Four commitments keep it honest, and all four are cheap if they are built in and expensive if they are retrofitted.

The realistic burden Expect a meaningful share of ongoing engineering to be source maintenance rather than new capability. Planning for it is the difference between a roadmap that slips and one that holds.
Commitment one

Freshness is a measured property, not a hope

Every source has an expected cadence. When a source goes quiet past its window, that is an alert, not something a client discovers. Staleness should be visible on the record itself.

Commitment two

Schema drift is detected on arrival

Contracts at the silver boundary fail loudly when a source changes shape. The alternative is a column that silently becomes null and a number that silently becomes wrong.

Commitment three

Quarantine is watched, not accumulated

Rejected records are only useful if someone looks. A rising reject rate on one source is the earliest possible warning that something upstream has moved.

Commitment four

Every run is replayable

Given the bronze evidence and a version of the transformation code, any past state can be rebuilt. Debugging becomes reproduction rather than speculation.

What good looks like after two years. A new source is added by writing a fetcher and a contract, and nothing else changes. A source breaking is noticed by the system before it is noticed by a customer. A disputed figure is settled in minutes by pulling the document. And the history of what we believed, month by month, is an asset that did not exist when we started and cannot be bought.
13 The case against, and what it costs #

A paper that only argues one side is a pitch. Here is the strongest honest case against everything above, followed by what it would cost to be right.

Objection one: this is over‑engineered for an early‑stage product

Largely fair. A single table refreshed nightly would answer most questions a first customer asks, and would exist in six weeks rather than six months. The argument for the fuller design rests entirely on the belief that the point‑in‑time and provenance questions arrive and cannot be answered retroactively. If that belief is wrong, the simple version wins.

Objection two: breadth beats depth in a sales conversation

True, and it is the objection we take most seriously. Nobody has ever lost a bake‑off for having insufficiently rigorous lineage. People lose them for missing a region. The answer is not to argue the point but to sequence so that visible coverage and invisible rigour advance together, which is what section 14 does.

Objection three: the hardest data is the data we cannot get

Also true. Some of the most valuable disclosure in this market is closed by statute rather than by paywall, and no architecture opens it. What the design does is stop us spending repeatedly on things that will never work, by recording the closure once and marking it.

Objection four: bitemporal modelling is genuinely harder to work with

Yes. Queries are longer, mistakes are subtler, and someone new to it will write a wrong query confidently in their first week. Mitigations exist, chiefly a small set of reviewed views that handle the common access patterns, but the learning curve is real and should be budgeted.

Kill criteria If after the first phase fewer than roughly one in twenty overlapping records disagree, and no client has asked a point‑in‑time question, the case in this paper is weak and we should build the simple thing.
The asymmetry The simple design can be upgraded in every respect except one: it cannot recover the history it did not keep. That single irreversibility is the whole reason to decide deliberately now.
On the estimates The table below is engineering effort, not money, and it is our estimate rather than a quotation. Treat the ratios as the signal and the absolutes as provisional.
Component Build Yearly upkeep What we lose by skipping it
Ingestion and bronze store2 to 3 eng monthslowReprocessing, dispute resolution, resilience to sources disappearing
Contracts and quarantine1 to 2 eng monthslowEarly warning on schema drift; failures become silent instead
Bitemporal silver3 to 4 eng monthsmoderatePoint in time answers, honest backtests, defensible history. Not recoverable later
Entity resolution4 to 6 eng monthshighCross‑source questions entirely. This is the product
Expert adjudication loop2 to 3 eng monthsongoing analyst timeQuality ceiling on the hard cases, and the training corpus that compounds
Provenance and citation1 to 2 eng monthslowThe ability to sell to anyone with a compliance function
Breadth across the registercontinuoushighCoverage, which is what the first meeting is actually about
Full design, before breadth13 to 20 eng monthsThe simple alternative is roughly 2 to 3, which is the honest price of this argument

The rows are deliberately additive rather than one commitment, because the sequencing in section 14 is designed so that the expensive rows can be declined after the cheap ones have produced evidence. To convert months to money, multiply by a blended fully‑loaded engineering rate; the ratios, not the absolutes, are the signal.

14 The sequence #

This section is the wish list, in the order we would want it granted. Nothing in it asks for a commitment; each phase is shaped so a team could start small, produce a number, and stop without regret, with every later decision still open.

A
Prove the premise before funding the architecture
Take three sources that overlap deliberately, one US federal, one UK, one entity registry. Load them raw, attempt the join by hand where necessary, and measure two numbers: how often the sources disagree on a field users would care about, and what share of entity pairs land in the uncertain band. Six weeks, one engineer, one analyst. And a fourth corpus is usually already in the building: joining an existing investor list against Form 5500 and Companies House runs the same test on data users already rely on (the case study after section 06).
ProducesEvidence for or against sections 08 and 09
B
Build the layers that cannot be added later
Bronze with content addressing and bitemporal silver, across the highest value sources only. Narrow, complete, and correct in the dimensions that are irreversible. Breadth stays deliberately low here.
GateOnly if phase A supports it
C
Resolution and the expert loop, instrumented from the first day
Blocking, scoring, and the adjudication queue, with the escalation rate reported weekly. If the rate does not fall as the labelled corpus grows, the loop is not working and we should say so early.
WatchEscalation rate over time
D
Breadth, on rails
Only once adding a source means writing a fetcher and a contract and nothing else. Coverage expands quickly at this point precisely because the first three phases made it mechanical.
TargetThe register in section 04
Why phase A first It is the cheapest possible test of the most expensive assumption in the paper, and it produces a number rather than an opinion.
Why the order holds Each phase is useful on its own and each one makes the next cheaper. There is no point at which we have spent a lot and have nothing.
If the wish list gets one line granted

Run phase A, and agree the number that decides phase B.

  • Run: six weeks, one engineer and one analyst, three overlapping sources.
  • Agree in advance: the disagreement rate and escalation rate at which the full design is worth building, and the rate at which the simple version wins instead.
  • A strawman to react to: commit to the full design if more than 1 in 20 overlapping records disagree on a field users would care about, or more than 5% of entity pairs land in the uncertain band; build the simple version if both come in under half that. Suggested defaults, not findings. Move them before the measurement, not after.
  • Decide nothing else up front. Phases B, C and D each come back with evidence attached.

Agreeing the threshold before the measurement is the part that matters. It is the difference between a test and a justification.

The filings have been public for decades. The advantage was never in reading them. It is in being the only party who can say, with a document in hand, what was true and when we knew it. The whole argument, compressed
RF References and further reading #

Nothing in this paper is invented here. The architecture is assembled from published, battle‑tested prior art, and the failure modes it defends against are documented in the open literature. Canonical links for the individual data sources live on their register rows in section 04.

A fetch caveat Several publishers (martinfowler.com, Databricks, sec.gov, dol.gov, federalregister.gov) refuse automated clients. Every link here was verified reachable on 25 August 2026.
Prior art and standards
Evidence the failure modes are real
The Filing Room · working paper on the intelligence product data layer Register: 87 sources, 78 confirmed, 9 assessed from documentation, 5 marked walls Press / to search the register, T to change theme

Prepared for discussion. Nothing described here is built. Statements about external sources were re‑validated against the live web on 25 August 2026; canonical links are carried on the register rows and in the references section. The observations in the case study were made directly against a live production database in August 2026; the exact figures are deliberately withheld. All of it should be re‑checked before anything depends on it.