===> Call this FIRST for: "catch me up on X", "what happened / why", "anything
before earnings?", "any earnings / 8-Ks / 13F moves / movers today?", "how is X
trading", and BEFORE aiming explore_data_catalogue, list_realtime_events or a
report tool at a company. Pass the user's question verbatim in `question`: it is
matched by keyword (never an LLM) against EVERY realtime event type — decks/
presentations -> ir_publication, 8-Ks, transcripts, upgrades, gainers/losers, 13F
exits, baskets, predictions, ... — and the plan STARTS at the type the user named.
A question naming only a family ("any earnings today?") walks that family's episode;
one naming neither ("what's going on?") sweeps every episode. Synchronous, public.
situate(symbols=["OKTA"], question="catch me up on OKTA") one or more names (max 5)
situate(question="any earnings events today?") no symbols = the market
situate(question="most significant investor decks today") step 1 = ir_publication
It reads the company event web (what HAPPENED to this company), the event ontology
(what that KIND of event entails, what follows it and how soon, where its payload
lives after the 12h realtime cache, when each table next refreshes) and market
status, and composes them into ONE response:
market exchange, is_open, session
symbols[S] web (newest 12 nodes; full graph via get_company_event_web),
newest_event, episode (the DOMINANT episode in the window — its
anchor and each member arrived | pending | overdue with rate and
expected_by), cache.present / cache.expired (inferred from node
age vs the TTL), freshness[] (per relation: last_refresh_at,
next_run_at, reflects_newest_event), cards (trimmed ontology
cards), deepen (tools the ontology says deepen this event)
universe (no symbols) shape (named_types | family | sweep), asked_types,
the plan order and cards, and event_types: the WHOLE realtime
corpus (type, family, one-line description) so you never guess
plan[] ORDERED tool calls: {step, tool, args, why, auth, sync, optional,
provenance, fallback}. `tool` is an exact tool name and `args`
are valid for it — pass them through unchanged.
skip[] calls that would return nothing or waste a job (an event type
that aged out of the cache, a 10-minute report) — DO NOT make these.
suggest[] calls to make ONLY IF their `when` arises after the plan has run
(explore_data_catalogue lives here, never in plan[]: it is a
multi-minute job, and "the user wants more than the 12h cache
holds" is the situation that earns it).
guidance[] situation-scoped rules: which tables have NOT refreshed since the
event, which followers are overdue, filer-scoped 13F nodes.
HOW TO EXECUTE:
1. Run plan[] in order. `sync=false` steps return a task_id — poll
get_task_status.
2. Never make a call that appears in skip[]; quote its `why` if the user asks.
Make a suggest[] call only when its `when` is true — an empty realtime list
is NOT that condition; say the cache is cold instead.
3. Read guidance[] before writing: an "overdue" follower is "not recorded yet",
not "did not happen"; a relation with reflects_newest_event=false shows the
PRIOR period, never the reaction.
4. Go beyond the plan only for what it did not cover — then get_company_event_web
(full graph, wider window) and get_event_ontology (full card / relation /
family) tell you what to call next.
Skip this tool ONLY for pure enumeration (list_options), an explicit "get me the
existing report" (get_latest_report), or a metric-history question with no event
in it ("Micron EPS growth over 8 quarters" -> explore_data_catalogue).
degraded=true means a source was unavailable (ontology not built, a web errored);
the plan still runs on what remains — follow it, and say what was unknown.