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 carrychannel: "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_cutonly). - On the Events interface,
delta.addedis the new pair this revision;state.labelsis the full set so far. - Subtypes are readable names, not codes —
merger_acquisition_terminatemeans what it says.