Nothing generated. Everything traceable.
The archive is transformed once, at ingestion, into eleven strata — from raw text at the surface to confirmed, citable records in the deep. Scroll to descend through them. Every field below traces to a character offset in a source document.
Raw document
The surface. The article enters exactly as published — character-addressable, hashed, untouched. Nothing is summarised away. Every deeper layer points back here.
Entities
Every actor in the archive collapses to one canonical node with a stable ID and the aliases six decades of reporting used for it. One thing, named many ways, counted once.
Mentions
The thread that ties an entity to the exact characters that named it. Provenance starts here: a mention is a coordinate, not a guess.
Claims
An assertion, carried with the verbatim sentence that made it and the character span it occupies. The claim is never paraphrased — the source text is the record.
Quantitative series
Figures buried in sentences become real series — value, unit, period, basis — every point still tethered to the claim and the sentence it came from. A chart you can audit to source.
Graph edges
Typed relationships drawn from a controlled predicate vocabulary. The machine proposes the edge; it is marked a candidate. It cannot become knowledge on its own.
Temporal frame
When each event happened and how long it held. Order is a fact the machine can establish. Causation is not — and that distinction is the boundary that follows.
The adjudication boundary.
Causal links and contradiction flags cross this line only when an editor confirms them. Automated extraction and human adjudication are formally separated — the model proposes, a person decides. Nothing below this rule was inferred silently.
Contradictions
Where two sources disagree, the system surfaces the disagreement with receipts and an editor adjudicates. It never quietly averages them into a single confident number.
Editorial positions
A publisher's judgement is data too. Stances are stored as first-class records — attributable, dated, and distinct from the facts they interpret.
Causal links
A candidate edge becomes a causal claim only by promotion — a named editor, a timestamp, a note. The provenance of the decision is stored alongside the link.
The adjudicated record
The deep. A single confirmed, citable record that gathers every layer above it. When Jacaranda answers a question, this is what it returns — evidence, with its full chain of custody intact.
Vectors, demoted.
Embeddings exist in Ondos for one job: discovery. They help find candidate records worth confirming — nothing more. A vector is never the source of an answer, and a similarity score never stands in for provenance. The store is an index into the strata above, not a substitute for them.
Run at scale, written like a changelog.
- Parallel ingestion workers — 32 concurrent · ~4.1k articles/hr sustained on the anchor corpus.
- Dual-pass entity deduplication — blocking key, then embedding nearest-neighbour; matches below 0.86 route to a manual review queue.
- Predicate vocabulary normalisation — all edges mapped to causal.v3 (114 predicates); unmapped relations rejected, not coerced.
- Claims dual-filtered — by subject entity and by source-text span; orphaned claims with no anchor are dropped.
- Char-offset integrity — verified on every record at write time; zero drift tolerated between record and source.
- Five extraction passes per article — NER, claims, quantities, edges, stance — each pass independently auditable.