Skip to main content
Every label you see on either stream — an event’s state.labels, a raw item’s labels — is a [family, subtype] pair from one vocabulary. Sources as different as an 8-K item code, a Korean disclosure category and a wire headline all resolve into the same names, so “show me every buyback, in every market, from every source” is one filter, not five. subtype: null is a positive statement, not missing data: the family is known, but the direction or specific action is not yet readable from what has arrived.

Layer 1 — the canonical vocabulary

34 families, 203 subtypes. Names are lowercase with underscores — they survive as SQL identifiers, JSON keys and URL segments unchanged. Results and the outlook The shape of the company Money in and money out What the company makes and sells The outside world acting on the company The company talking about itself Not one company, and the escape hatches

Layer 2 — each market’s own classification, mapped in

Regulated markets already classify their own disclosures, and those classifications are better than anything re-derived from text — so they are kept verbatim on the item and bridged into the canonical families: A native category that has no canonical home yet stays explicit — mapped-to-nothing is distinguishable from not-yet-mapped, so a filter never silently drops a market.

Layer 3 — news-side labels

Wire coverage is labelled by a model against the closed family list, then normalized through an alias layer — the many spellings the world uses for one thing (m&a, outlook, forecast, restructuring…) resolve to one canonical name before anything is emitted. Some families only exist on this side, because a company does not publish its own downgrade: analyst, competition, narrative_change, macro come from coverage, not filings. The impact reading that travels with news items (direction, score) is separate from the label and is always this system’s judgment, not the label’s.

Layer 4 — company IR pages

Company newsrooms are a door of their own: IR press releases are collected daily from companies’ own websites and classified by a rule-matched taxonomy (102 subtypes across 28 families, measured against real release titles) that feeds the same vocabulary — an earnings release on a company’s site and the wire story about it land in the same event with the same labels. IR items carry channel: "company_ir", and guidance read out of a release or an earnings call joins the same events through the guidance ledger.

Using labels

  • Filter on family for breadth (["guidance", *]), on subtype for direction (guidance_cut only).
  • On the Events interface, delta.added is the new pair this revision; state.labels is the full set so far.
  • Subtypes are readable names, not codes — merger_acquisition_terminate means what it says.