===> `situate(...)` composes this with the event web and the cache state and
hands you a plan — start there. Call this tool directly for the FULL card of an
event type, a relation card, a whole family, or the unfiltered graph, when the
plan did not cover what you need next.
===> REQUISITE for: any real-time / live-events request, any "what
happened / why / catch me up" question, and BEFORE aiming explore_data_catalogue or
generate_report_for_stock at a company whose situation is event-driven. Cheap,
synchronous, public, symbol-INDEPENDENT and cacheable — fetch once per event type
(or once unfiltered, ~230 KB) and reuse for the whole conversation.
Pass exactly ONE filter for a small card (~5-10 KB):
event_type="eps_update" one event type and the relations it entails
relation="eod_stock_prices" one table/view and the event types that entail it
family="earnings" every event type and relation in a family
No filter -> the whole class graph (21 event types, ~300 relations, 20 tools).
Web nodes from get_company_event_web carry the join keys verbatim: pass a node's
`type` as event_type, its `relation` as relation, its `family` as family.
An event_type card carries:
about what the event is ABOUT: symbol | filer | strategy. A 13F
event is a FILER's action across N names — the symbol
you asked about is one of them.
persisted_in the durable table to read once the event has aged out
of the realtime cache (realtime_cache_ttl_hours, 12h) —
list_realtime_events returns [] after that; the data is
still there, in this relation.
entails.<layer> the relations WRITTEN by the same chain run (mined, with
run counts) plus every view above them (pg_depend),
bucketed base / silver / gold / dimension / analysis.
These are the tables that are FRESH because this event
fired — name them explicitly in explore queries.
entails.realtime_events event types that usually FOLLOW, each with rate,
median_lag_hours, lift, mode (trigger = dispatched by the
same chain, near-certain; sequence = world-ordered,
independently detected, probabilistic), certainty /
expected_within_hours when declared, and persisted_in.
preceded_by the inverse — what should ALREADY exist earlier in the web.
episodes named world-order sequences (earnings, realtime_mover,
thirteen_f_cycle, news) with this event's position — the
whole shape of the situation from any one member.
produced_by[].schedule the workflow that publishes it, its cron, and
next_run_at (America/New_York).
deepened_by the tools that deepen this event once you have its payload.
informs DOMAIN causality (news -> prices, earnings -> estimates):
what an analyst checks next. Declared and the WEAKEST
edge — never present it as lineage.
evidence how many of these events the platform has seen.
A relation card carries: layer, family, cadence (update_frequency + prose),
derives_from / feeds (pg_depend), computed_from / computes (LLM and model writers),
refreshed_by[].schedule with next_run_at, read_by (the MCP tools that read it),
entailed_by (event types), informs.
THE FRESHNESS CHECK — the reason this tool exists: compare a web node's `at` with a
downstream relation's refreshed_by[].schedule[].next_run_at. If next_run_at is AFTER
the event, that relation does NOT reflect the event yet. Do not query it for the
reaction — use the intraday tools (detect_intraday_outlier_jumps,
get_aftermarket_data) or say the daily table lags.
Every edge carries `provenance` (mined | declared | pg_depend | static:tasks.py |
beat | catalogue | data_model), the same honesty axis as the web's `cause`: mined
and pg_depend are facts, declared is the platform's own judgment, informs is domain
intuition. Quote the grade when you lean on an edge. format="triples" returns raw
subject-predicate-object rows instead of cards. degraded=true means the table has
not been built yet, not that the type is unknown.