Oracle
oracleTurn your follows, bookmarks, and subscriptions into trusted sources: screen ranked candidates, confirm who to keep, and deep-ingest their posts into your knowledge base.
Instructions
Choose who to trust: turn the people you already curate (follows, Lists, bookmarks, subscriptions, likes) into your Oracles — the sources the KB deep-ingests and roots trust on. Runs entirely in chat.
NOT the setup tool. onboard readies the machine (keys, consent, the first curation pull);
this decides WHO is in. Reach for this when the user asks who to trust, wants to see or
change their people, or asks whether their sources are current.
FLOW: call action='screen' → read the ranked candidates to the user (the PRE-TICKED ones
are people you've corroborated with ≥2 distinct signals — your default-yes set; the rest are
shown unchecked; non-persons are demoted to the end, never hidden) → ask which to keep →
call action='confirm' with the kept canonical_ids → then, before action='ingest', ask
the user how far back to pull and pass their answer as x_lookback.
Why that question is not optional: the default is only ~6 months, so a user who wanted
their Oracle's whole visible history gets a fraction of it and is never told. (It is no
longer a COST question — X reads are free since the cutover — it is a completeness one,
which is the same reason to ask and a different reason to give.) action='screen' returns the exact presets and defaults under lookback_options —
offer those, don't invent your own. The web archive is FREE and already pulls in full, so
ask about it (web_lookback) only if the user wants it NARROWED.
To add someone NOT in the list, pass their X @handle or Substack URL in add_handles —
they're resolved and added on the spot.
action:
• "screen" (default) — the ranked candidate payload. Each candidate carries its
reflected signal ("you follow · subscribe · bookmarked 12×"), pre_ticked
/ shown_by_default / is_person flags, distinct_signals, and its
canonical_id (pass these to confirm). classify.ran=False means the kind
classifier degraded open (LLM unavailable) — everyone stays person-eligible.
• "confirm" — commit Oracle picks. canonical_ids = the ones the user kept (verbatim from
screen); add_handles = raw X handles / Substack URLs to add (resolved-at-
confirm). Idempotent. Returns {confirmed, unresolved, unknown, total_oracles}
— surface unresolved (handles a lookup couldn't find) to the user.
• "ingest" — deep-ingest confirmed Oracles into the atom-KB. For each (all confirmed, or
just the canonical_ids you pass) run discovery — which mines their trusted
blog/Substack for their OTHER profiles — then ingest each trusted personal
profile as atoms attributed to the Oracle; an org link becomes an affiliation;
an ambiguous one is left for review. Returns a per-source outcome report,
with the windows actually pulled under lookback — read those back.
• "candidates" — the OTHER half of the promotion decision. screen ranks people by how
hard the USER vouched for them (distinct curation signals); this ranks the
same people by what they actually write. Pass query to ask a topic
question ("who writes about agent memory"); omit it to list who is there.
Evidence comes from TWO stores and every row names which, in basis:
· "probed" — a light sample of their own timeline (~25 posts). UNVETTED:
nobody vouched for this text, only for the person being worth a look.
Never cite it as knowledge-base content or quote it as fact.
· "saved" — a post the USER saved, so it IS a knowledge-base atom and is
citable (open it first). Usually exactly ONE post, and it is a positive
example rather than a sample of their output: it matched partly BECAUSE
the user kept it. Good evidence for "worth reading more of", weak
evidence for "this is what they mostly write about".
Scores are comparable only WITHIN a basis; the two are interleaved by rank,
never added. Read back no_local_material — a candidate absent because
nothing of theirs is stored looks exactly like one whose writing did not
match, and those need opposite actions.
Is my stuff still current? You do not ask — screen answers it unasked, under
oracle_freshness: per-Oracle, per-source last_pulled_at / hours_overdue /
never_refreshed / breaker_open, worst first. If needs_attention is true, read its
note out — that flag means either nothing has ever opted in to refreshing, or the cycle
has stretched past twice its target. Both are silent failures otherwise.
A model_routing key, when present, lists models that are dead (no OpenRouter
provider survives the deny-list — the stage using them cannot run) or fragile (one
surviving provider — one withdrawal from dead). Read it out: it is absent whenever
everything is routable, so its presence IS the news.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| floor | No | screen — minimum candidates shown by default before "see all" (default 15). | |
| force | No | ingest — the "ignore what we decided last time" override, and it now means TWO things. (1) Ingest a footprint source even when the single-author gate would skip or park it (for a solo publication the classifier mislabels). (2) Re-run DISCOVERY from scratch, ignoring the trust cache — reach for this when a person's sources look wrong or incomplete and their X profile has not changed, since the cache key only invalidates on a display-name or declared-link change. A source they created after the last run, or a fix on our side, leaves that key identical. | |
| query | No | candidates — a topic question to rank people by ("agent memory", "biotech funding"). Omit for "who has been sampled". | |
| top_n | No | candidates — how many people to return (default 30). NOT a screen knob: `screen` classifies every candidate and returns all of them. | |
| action | No | "screen" | "candidates" | "confirm" | "ingest". | screen |
| x_lookback | No | ingest — how far back to pull each Oracle's X timeline: "6mo" (the default), "1yr", "2yr". Hard-capped at 2 years whatever you pass. Ask the user — not for cost (the pull is free), but because the default truncates. "since_last" is the cheap top-up: pull only what has appeared since this Oracle was last pulled. Use it whenever the user wants someone brought current rather than re-ingested — a 5-day gap costs one request instead of ~19. It errors rather than guessing if the Oracle has never been pulled. | |
| add_handles | No | confirm — raw X @handles / Substack URLs to add beyond the ranked list. | |
| min_signals | No | candidates — only people with at least this many distinct curation signals (default 1 = everyone in the list). | |
| web_lookback | No | ingest — how far back to pull the Substack/blog archive: "1yr", "2yr", "5yr", "all" (the default). Only narrows; omit unless the user asks. | |
| canonical_ids | No | confirm — the kept candidates' canonical_ids; ingest — which confirmed Oracles to ingest (omit = all confirmed — usually NOT what you want for a top-up, so name the person). |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||