three.ws / Oracle / Docs
Documentation · living reference

Oracle — the conviction engine, end to end

Oracle reads every pump.fun launch the moment it appears and answers one question: how much conviction does the on-chain evidence actually support? It fuses four independent reads — who is buying, how the launch is structured, what story it rides, and how it is moving — into a single transparent 0–100 score, then lets your 3D agent act on the plays that clear your bar. This is the complete reference: the thesis, the exact math, the data, the evidence, the API, the limits, and where it goes next.

📖 ~35 min read 🟢 Plain-English throughout 🔬 Deep dives for the math Updated 2026-06-30
Open the live Oracle → Arm an agent
The live Oracle page: a hero reading 'Stop guessing the coin. Know the conviction.' above a live stat strip and a conviction-breadth bar with narrative category cards.
The live surface. Every launch in the last 12 hours, scored and ranked, with a live conviction-breadth bar and per-narrative averages. three.ws/oracle
Orientation

How to read this

These docs are written in two layers so the same page serves a curious first-timer and a quant who wants the closed form.

Plain  The body text

Every section opens in plain English: what it is, why it exists, and how to use it. If you only read the prose, you will understand the whole system and never see a formula you didn't ask for.

Deep dive  The disclosures

Anything labelled Deep dive expands into the exact math, constants, code paths, and edge cases — the researcher's layer. Closed by default. Use Expand all up top to read everything at once.

Conventions

Numbers and thresholds quoted here are the real production constants from the engine. Tier names are prime · strong · lean · watch · avoid. Pillars are nicknamed WHO (pedigree), HOW (structure), WHAT (narrative), MOVE (momentum) throughout the product and these docs.

Five minutes

Quickstart

Three ways in, depending on what you want from Oracle today.

Prefer to integrate? Every number on the page is a public endpoint — jump to the API reference. Agents can poll /api/oracle/signal for a machine-ready buy/watch/skip recommendation.

Why this exists

The thesis

pump.fun mints thousands of tokens a day. Almost all go to zero. The few that run, run violently. The entire game is a signal-extraction problem under extreme time pressure — and the edge is not a secret indicator, it is coverage.

The problem: asymmetric information at the speed of a block

When a coin launches, the people who win are the ones who already know things you can't see fast enough: whose wallets are buying (and whether those wallets have a track record or a rug history), whether the launch is organic or a coordinated bundle, whether the "community" is 200 real people or 200 freshly-funded burner wallets, and whether the story has cultural legs. By the time a human reads a chart, the asymmetry has already paid out.

Every one of those facts is on-chain or one inference away from it. The bottleneck has never been availability — it is assembly and speed. No human watches every wallet across every launch and fuses it into a decision in seconds. A machine can.

The bet: fuse full-coverage data into one honest number

Oracle's wager is that a transparent, calibrated fusion of who / how / what / move beats both gut instinct and any single indicator, because the failure modes are independent. A great story (WHAT) cannot save a launch where the dev already sold (HOW). A pile of smart-money wallets (WHO) means little if they are already trimming (also WHO). Fusing independent reads cancels noise and surfaces the rare launch where every axis agrees.

Two design commitments make that bet honest:

  • Transparency over magic. Every score ships with the reasons that built it. There is no opaque model output you are asked to trust — you can read why a coin earned an 82 or got capped at 46.
  • Proof over promises. Every verdict is checked against ground truth — did it graduate, rug, or run — and the realized win rate, with confidence bands, is published on the page. When the edge is thin, the page says so.

Why it compounds

The system gets sharper the more it watches, on two flywheels. The data flywheel: every resolved outcome updates the wallet-reputation graph that powers the WHO pillar, so the definition of "smart money" is continuously re-earned, never hard-coded. The calibration flywheel: every graded outcome tightens the backtest, exposing exactly where the score is over- or under-confident so the model can be re-weighted against reality rather than intuition.

The one-sentence version

Oracle turns the full on-chain footprint of a launch into one transparent, continuously-calibrated conviction score — and then lets an agent act on it within hard limits, grading itself against the outcome every time.

Architecture

The system at a glance

Oracle is a thin, fast conviction layer on top of a full-coverage pump.fun data brain. It does not re-ingest the chain — it reads the brain's tables, adds two things the brain doesn't have (cultural narrative and an action loop), and closes the loop against outcomes.

The closed loop — launch to verdict to action to learning
Source
pump.fun
Every new launch + its on-chain trades.
→
Brain
Intel tables
Wallets, structure signals, reputation, outcomes.
→
Oracle
Assemble + classify
Fuse intel; LLM narrative w/ live news.
→
Oracle
Convict
Four pillars → one 0–100 score + tier.
→
Surface
Feed / stream / API
Live to humans and agents.
→
Act
Agent loop
Armed agents buy within caps.
→
Learn
Settle + backtest
Grade vs outcome; recalibrate.

Concretely, the platform splits into three cooperating parts:

Read path

The conviction library

A pure, side-effect-free scoring function (convict()) plus a defensive data-assembly layer. Given a mint, it returns a score, tier, pillar breakdown, and reasons. No I/O during scoring, so it is fully testable.

Run path

The worker

A long-lived Node process running three independent loops: score (keep verdicts warm), agent (act on armed watches), and settle (grade outcomes), each self-scheduling so a slow pass never blocks a fast one.

Edge path

The API + UI

~24 endpoints (JSON + SSE) serving the feed, coin detail, wallet intel, backtest, streams, and the agent-config surface. Cached at the CDN; rate-limited per IP.

Design principle

The scoring is a pure function of assembled intel. Everything stateful — ingestion, persistence, execution, settlement — lives outside it. That boundary is why the math is testable, the verdicts are reproducible, and the same engine powers the live feed, the API, and an agent's decision with identical results.

The model · part 1

A model fitted from real outcomes

Since 2026-08-09 the conviction engine is a bucketed logistic model fitted on the platform's own labeled outcome history, and since 2026-08-28 it refits itself every six hours behind a promotion gate that can refuse a candidate. Every launch-time signal is bucketed by its empirically observed ranges, each bucket carries a fitted log-odds weight, and the fused sum passes through a sigmoid into a calibrated probability. Not a black box: a lookup table anyone can audit, published whole at GET /api/oracle/model and scoreable offline through @three-ws/oracle-model on npm.

The current model is v3, and v3 changed the question. Earlier versions scored the odds of a spike: graduated, or peaked at 3x or more above the market cap at first sight. v3's published head scores the odds of a spike that holds: the same 3x-or-graduation bar, but only if the coin is still worth at least what it cost when Oracle first saw it. A coin that ran 3x and gave it all back is a hit under the old label and a miss under this one. That is the holder's question rather than the flipper's, and because it is a stricter bar the base rate underneath every number below is much lower than v2's was. The engine also fits two companion heads on the same features, rug and moon, which the API publishes alongside the one the score is built from.

Measured, not asserted: the model running right now Loading v3 · fitted 2026-09-08
0.846
Holdout AUC
3.0%
Base rate
11.8x
Lift, top 1%
0.026
Brier
400,000
Labeled launches
100,000
Held out, unseen
25
Features
109
Fitted buckets

Pillar weights, derived from each pillar's share of the fitted log-odds range: WHO 0.17 · HOW 0.20 · WHAT 0.03 · MOVE 0.60. Precision at depth on the same holdout: top 1% 35.5%, top 5% 23.4%, top 10% 15.7%, top 25% 9.1%. Features the fit dropped for carrying no signal: fresh_wallet_ratio, bubblemap_connectivity.

Live model card unavailable. The numbers above are the values baked into this page at publish time, so they stay correct as documentation but may trail the model in production by a refit or two. Read them straight from the engine at /api/oracle/model?view=card.

Every figure in this block is read live from GET /api/oracle/model?view=card when you open the page, because the model refits every six hours and any number typed into a document goes stale by design. The registry view lists every fit ever attempted, promoted or refused, with the reason.

The four pillars remain as the lens: every feature belongs to WHO, HOW, WHAT, or MOVE, each pillar bar shows what its own evidence alone would imply, and the pillar weights shown in the API are derived from the fitted model (each pillar's share of the total log-odds range its features span) instead of hand-picked constants.

① WHO: Pedigree

The question: who launched this coin, and who is already in it? The fitted features: the creator's launch record (a first launch runs at 1.9x the base good-rate; a creator with any prior graduation at 1.5x; five-plus launches with none graduated at 0.26x), the dev's buy size, and whether the dev sold inside the observation window.

On top of the fitted features sits the smart-money overlay: proven wallets are too rare to fit statistically (998 platform-wide against 288k judged), so when they appear they adjust the fused log-odds as documented expert priors: proven wallets in the book add up to +0.75 log-odds, a 40%-plus proven share of buy volume adds +0.3, each flagged rugger/dumper wallet subtracts 0.45 (up to three), smart money already exiting half its position subtracts 0.7. A wallet counts as proven if labelled smart_money/kol, scores ≥70, or holds a 35%-plus win rate over 8-plus judged coins: a sustained ~3x edge, validated on holdout outcomes (coins with 3+ such wallets buying early were good 95% of the time).

One hard cap survives: a creator with 3-plus launches and zero graduations (or a wallet flagged as a rugger) ceilings the final score at 45, inside Watch. A graveyard dev can never present as Strong. Every other old cap: including the unknown-pedigree ceiling that silently pinned the entire feed below Strong: is gone: missing data now reads as fitted null-bucket evidence, not as a verdict.

② HOW: Structure

The question: what does the launch's shape say? The fitted features: organic-demand score (the single strongest signal: below 0.2 observes 0.11x the base good-rate, 0.8-plus observes 5.1x), bundle score, snipe ratio, coordination score, buy-timing entropy, and top-1/top-10 holder concentration.

What the data corrected: several old structure penalties were backwards at the 90-second observation window. Top-10 concentration in the 0.3-0.9 band is a positive signal (5-8x base): "low concentration" at 90 seconds usually means nobody bought. A mid-range snipe ratio (10-70% of the open) is a positive signal (2.7-3.6x): bots racing an open is evidence of demand; the poison is 70%-plus. The fitted buckets encode the real curve instead of a hand-drawn one.

③ WHAT: Narrative

The question: what is the coin about? The classifier assigns each launch a category; the category's fitted weight is what the outcome data actually supports: which is far less than the old hand-set priors assumed. Deliberately the lightest lane now: the observed spread across meme/animal/ai/tech is small, and roughly inverted from the old ranking in places (tech observes 0.32x base; "unknown" 1.52x).

④ MOVE: Momentum

The question: is real demand showing up, right now? The fitted features: unique early buyers (40-plus observes 6.8x base), buy/sell ratio, total early buy volume (25-plus SOL: 6.0x), largest single buy, average buy size, and market cap at first sight: the dead-on-arrival tell the old engine ignored entirely (below 28 SOL observes 0.27x base). An oversized dev buy is not penalized anymore: 6-plus SOL observes 1.36x base, the opposite of the old honeypot heuristic.

The model · part 2

Fusion & tiers

The fusion is a sum in log-odds space, a sigmoid, and a fixed monotone map onto the public 0-100 ladder: so every tier boundary states a measured probability.

# fitted bucket weights + smart-money overlay, in log-odds z = intercept + Σ w[bucket(feature)] + overlay # calibrated probability it runs 3x or graduates AND holds entry p = 1 / (1 + e^(−z)) # fixed monotone map; anchors: 5%→34, 12%→56, 25%→72, 45%→86 score = map(p) # the one surviving veto: serial-rugger creator score = min(score, 45 if rugger_creator)

The tier ladder

Each boundary is anchored to a probability, and each band's holdout performance is published next to the probability it claims. Tiers are how humans skim the feed and how agents set a bar. These rows update from the live model card when the page loads, for the same reason the block above does: the refit runs every six hours and a number typed into a document is stale the moment it ships. A band observing more than it claims is the engine being conservative at that boundary, which the next refit's promotion gate checks explicitly.

Conviction tiers: score → tier → measured odds
Prime
86-100
≥ 86
Claims 45% · holdout observed 45.7% good over 300 launches
Strong
72-85
≥ 72
Claims 25% · holdout observed 29.2% good over 1,133 launches
Lean
56-71
≥ 56
Claims 12% · holdout observed 20.1% good over 3,465 launches
Watch
34-55
≥ 34
Claims 5% · holdout observed 7.2% good over 9,572 launches
Avoid
0-33
≥ 0
Claims nothing · holdout observed 1.4% good over 85,530 launches

Alongside the score, the engine emits badges (e.g. smart-money, structure-flag, pedigree-flag, news, momentum, thin-data, prime) for fast visual scanning, and an ordered list of reasons: strongest evidence first, each quoting the observed outcome rate for the bucket it hit ("organic demand ≥0.8: 60% of similar launches worked"). The engine cites its training data instead of asserting adjectives.

Read the reasons, not just the number

Two coins can both score 70 for completely different reasons: one on a broad organic base with an unknown creator, another on a proven creator over a thin book. The tier tells you how strong; the reasons tell you why, and the why is what you trade on.

Worked example

Anatomy of a score

Here is the coin drawer the product shows when you click any launch. It is the score, fully unpacked — the same object the API returns, rendered for a human.

Oracle coin drawer showing a conviction of 35 in the 'watch' band, the WHO/HOW/WHAT/MOVE pillar bars, a 'why this score' list with four plain-English reasons, structure bars for organic-buy and bundle, an empty who's-in roster, and a live-trades panel.
One verdict, fully unpacked. Conviction 35 (watch): the WHO/HOW/WHAT/MOVE pillars across the top, a plain-English “why this score” list, the structure read (organic-buy vs bundle), the who's-in wallet roster, and a live trade tape — all for a single launch.

Walking the drawer top to bottom mirrors the model exactly:

  • The four pillar bars (WHO / HOW / WHAT / MOVE) are the sub-scores: what each pillar's own fitted evidence would imply alone, on the same probability-to-score map as the big number.
  • “Why this score” is the reasons[] array, strongest evidence first, each line tagged to its pillar and quoting the observed outcome rate for the bucket it hit, e.g. "unique early buyers >=40: 80% of similar launches worked (6.8x base rate)" (MOVE). The engine cites its training data instead of asserting adjectives.
  • Structure / wallet-graph / buy-pattern expose the raw HOW inputs (organic-buy %, bundle %, snipe ratio, holder concentration) so you can audit the guardrail. The funder-graph panel renders only when a funder is resolvable; see Limits for why it is usually not.
  • Who's-in is the live pedigree roster — every notable wallet, its label, and its track record.
  • Live trades streams the coin's buys and sells in real time, each annotated with the trader's wallet archetype.

Every field here is also available programmatically from GET /api/oracle/coin?mint=… — see the API reference.

The machine · part 1

Data & ingestion

Oracle reads from a separate full-coverage data brain rather than touching the chain itself. The brain ingests pump.fun and maintains the reputation graph; Oracle assembles, classifies, and fuses. The separation is what keeps scoring a pure, fast function.

What the brain provides (read-only)

Five brain tables feed every score. Oracle queries each one defensively — a missing or younger table degrades the affected pillar gracefully rather than failing the whole verdict.

Brain tableFeedsKey columns Oracle reads
pump_coin_intelHOW, WHAT, metadatasymbol, name, image, category, creator, bundle_score, organic_score, snipe_ratio, fresh_wallet_ratio, concentration_top10, bubblemap_connectivity, risk_flags, buy/sell counts, dev buy/sold
coin_smart_moneyWHO (base)smart_money_score, smart_wallet_count, proven/total buy lamports, notable[]
pump_coin_walletsWHO, HOWper-wallet buy/sell lamports, is_creator, funder (cluster source)
wallet_reputationWHO (labels)label, smart_money_score, win_rate, early_win_rate, dump_rate, coins_traded, creator_count, creator_wins
pump_coin_outcomesEvidence, settlementgraduated, rugged, ath_multiple, last_market_cap_usd

Narrative: a model with the news on its desk

The WHAT pillar is the only place Oracle reaches outside the brain. To classify a launch's story, it fetches live crypto headlines from a public news API (cached ~90s), injects them into the language model's prompt, and asks for a category, a one-line narrative, a virality estimate, and a confidence. A coin literally riding today's headline gets recognized as such and scored higher. If the model is unavailable, a deterministic keyword classifier takes over so a verdict always ships.

Pedigree: reputation earned, with a cold-start prior

"Smart money" is not a hard-coded list — it is continuously re-earned from outcomes in the wallet_reputation graph. For wallets the brain hasn't judged yet, Oracle seeds a cold-start prior from a curated known-wallet set (sourced from public KOL/wallet intelligence), so a brand-new coin still gets a useful pedigree read on its first scoring pass. Precedence is always earned reputation > prior > unproven.

Top-wallets leaderboard: a ranked table of wallet addresses tagged 'Smart Money' with win-rate, early-win, and reputation-score columns.
The pedigree graph, made browsable. Every wallet Oracle has judged, ranked by track record — early-buy win rate against dump/rug behavior. This is the raw material the WHO pillar reads. Top wallets tab
Deep dive Oracle's own tables & data lifecycle ›

Oracle owns five tables: oracle_narrative (classified story + virality), oracle_conviction (the live verdict cache, one row per mint), oracle_conviction_history (score time-series, written only on a ≥3-point change, 72h retention), oracle_agent_watch (armed-agent config), and oracle_watch_actions (the action ledger). Full columns in the data model.

Lifecycle: a coin must be ≥… actually first-seen and within a 12h window to enter scoring; it's scored, classified, and cached; rescored when stale (every ~3 min if new data arrives); its history appended on material change; quote/stablecoin mints (USDC, wSOL, …) are excluded and purged. Nothing about a score decays purely with time — the engine is event-driven, reacting to new wallet activity, not a clock.

The machine · part 2

The worker

A single long-lived Node process runs three independent, self-scheduling loops. They share nothing but the database, so a slow scoring pass never delays an agent acting, and a stuck confirmation never freezes scoring.

every ~15s · batch 20

Score loop

Finds recent launches that are new or stale (last scored >3 min ago), scores each (assemble → classify → fuse → persist) and appends history on material change. Keeps the cache warm.

every ~3s

Agent loop

For each armed watch, evaluates freshly-scored coins against the agent's bar and budget, executes a buy when the gates pass, and fires alerts. Dedups so an agent never acts twice on one coin.

every ~60s · batch 100

Settle loop

Finds open actions whose coin now has a resolved outcome, grades each win/loss/flat, marks PnL to market, and closes the learning loop.

Cold start & graceful degradation

If the conviction cache is empty (fresh deploy), the feed endpoint scores a handful of recent coins on the spot — database-only, no LLM — so the UI is never blank while the score loop catches up. Every brain query is wrapped so a missing table yields a null slice, not a crashed pass.

Deep dive Configuration, safeguards & the kill switch ›

The worker is configured entirely by environment. Selected knobs (with defaults): ORACLE_MODE=simulate, ORACLE_NETWORK=mainnet, ORACLE_SCORE_INTERVAL_MS=15000, ORACLE_AGENT_INTERVAL_MS=3000, ORACLE_SETTLE_INTERVAL_MS=60000, ORACLE_SCORE_BATCH=20, ORACLE_RESCORE_AFTER_SEC=180, ORACLE_MAX_TRADE_SOL=0.25 (absolute per-trade ceiling), and ORACLE_GLOBAL_KILL=1 (halts all agent + settle activity while scoring continues). Live mode additionally requires the secret used to decrypt agent wallets, and refuses to start without it.

Operational safeguards layer up: a global kill switch, a hard per-trade SOL cap enforced in the executor (independent of any per-agent setting), per-watch daily-spend and open-position caps, a 60-second confirmation timeout so stuck transactions don't block the loop, and a 60-second cache on decrypted keypairs to bound decryption overhead during bursts. Simulate is the default — the worker logs realistic actions with zero spend unless explicitly switched to live.

The machine · part 3

The agent action loop

Conviction is only half the product. The other half is letting a 3D agent act on it — autonomously, within limits you set, grading itself against every outcome. That is what /oracle/arm configures.

The 'Arm your agent' page prompting the user to create a 3D agent, with the configuration surface for conviction bar, position sizing, caps, narrative filters, alerts, and a live qualifying-coins preview.
Arm your agent. Pick an agent, set the bar (Prime / Strong+ / Lean+), the position size and caps, optional narrative filters and Telegram alerts, then arm in simulate or live. A live preview shows exactly which coins would clear your rules right now. three.ws/oracle/arm

How a decision is made

For every armed agent, on every freshly-scored coin, a pure decision function runs a sequence of gates. If any gate blocks, the agent passes; if all clear, it sizes and buys.

GateBlocks when…
Armedthe watch isn't armed
Min score / tierconviction below the agent's bar
Narrative filtercategory not in the agent's allow-list (if set)
Require smart moneyno proven wallet is in yet (if required)
Max open positionsthe agent is already at its concurrency cap
Daily budgetthis buy would exceed the 24h spend cap

Position size is the agent's base per-trade amount, optionally scaled by conviction — up to 1.5× as the score climbs from the agent's minimum toward 100 — so the agent leans harder into the strongest plays without ever exceeding its caps.

Simulate vs live

Simulate (the default) logs a realistic action — same gates, same sizing, same grading — but spends nothing, so an agent can build a verifiable paper track record before a cent is at risk. Live decrypts the agent's wallet, builds a pump.fun buy with slippage protection, optionally routes through a Jito bundle for MEV protection, confirms on-chain, and records the signature. Both paths write to the same ledger and are graded identically by the settle loop.

Deep dive The executor — sizing, Jito routing, hard caps ›

Conviction-weighted size: size = base · (1 + clamp((score − min)/(100 − min), 0, 1)·0.5). The executor then applies the absolute ceiling: size = min(size, ORACLE_MAX_TRADE_SOL) — a guardian limit that overrides any per-agent setting.

Live routing builds buy instructions via the pump SDK with 10% slippage, fetches a fresh blockhash, and either sends a raw transaction (skip-preflight off, up to 3 retries, 60s confirm race) or, when Jito is enabled, prepends a small tip transfer to a rotating tip account and submits the pair as a bundle to the block-engine endpoint. The action is written as filled with the signature (or jito:<bundleId>), skipped if the agent has no wallet, or failed on any on-chain error — never silently dropped.

The evidence · the science

Calibration & backtest

A conviction score is a probabilistic claim, and a probabilistic claim is worthless unless it's checked against reality. Oracle joins every verdict to its ground-truth outcome and publishes the result on the page — including when the edge is thin. This is the part that separates a model from a vibe.

The Edge tab: aggregate stats (total scored, win rate with 95% CI, wins, losses, graduated, rugged), a 'win rate by conviction tier' table with confidence bands, and a 'calibration — realized win rate by score band' ladder comparing realized win rate to the band's prediction.
Proof, not promises. Win rate by tier with 95% confidence bands, and a calibration ladder plotting realized win rate against what each score band predicts. Snapshot from the live edge tab on 2026-06-30 — a low-conviction window, shown honestly rather than cherry-picked.

What "win" means

A scored coin is a win if it graduated, or reached a ≥2× ATH multiple without rugging; a loss if it rugged or languished below 1.2×; flat in between. The "without rugging" clause matters: bundled launches routinely spike 2× from first sight before collapsing, and counting those wicks as wins would let pump-and-dumps inflate the very number that's supposed to expose them. Only resolved coins count toward a win rate — open positions are excluded, so the number can't be inflated by undecided bets.

Two win rates are published, deliberately kept apart: the call win rate (resolved coins Oracle rated Lean, Strong, or Prime — the tiers it tells you to act on) and the market base rate (every scored launch — what blindly buying everything would return). Until real calls resolve, the call win rate reads "no calls resolved yet"; the base rate is never presented as the engine's skill.

The four things the backtest publishes

Win rate by tier, with honest error bars

Each tier's realized win rate is shown with a 95% Wilson confidence interval — the right tool for win-rate estimates on small samples, where a naïve ± would lie. A wide band means "not enough data yet," and the page says so.

Calibration ladder

Coins are bucketed by score (0–10, …, 90–100) and each bucket's realized win rate is compared to the score it predicts. A calibrated engine keeps realized near predicted and climbing band-over-band.

Brier score

One number for overall calibration error — the mean squared error of (score/100) against the binary outcome. Lower is better; 0 is perfect, 0.25 is a coin flip.

Edge multiple & monotonicity

Does prime actually beat blind buying? The page reports prime's win rate, the lift over the base rate, the edge multiple, and whether win rate rises monotonically across tiers.

Deep dive The Wilson interval & why we use it ›

For w wins in n resolved coins, the 95% Wilson score interval (z = 1.96) is:

p = w/n,  z² = 3.8416
centre = (p + z²/2n) / (1 + z²/n)
margin = z·√( (p(1−p) + z²/4n) / n ) / (1 + z²/n)
CI = [centre − margin, centre + margin]

Unlike the normal approximation p ± z·√(p(1−p)/n), the Wilson interval stays inside [0,1], doesn't collapse to zero width at p=0 or p=1, and behaves correctly for the small n that young backtests have. It is the difference between an honest "we don't know yet" and a dishonest "0% ± 0%."

Honesty clause

The snapshot above is a thin, low-conviction window — realized win rates sit below the band midpoints and few coins reached the higher tiers. That is shown, not hidden. The page is built to display a weak edge as readily as a strong one, because a backtest you only trust when it flatters you isn't a backtest.

The evidence · grading

Outcomes & grading

Every action an agent takes — simulated or live — is graded against ground truth and lands in its permanent win-rate ledger. This is what makes an agent's track record verifiable instead of asserted.

When a coin's outcome resolves, the settle loop grades any open action on it:

  • Win — the coin graduated, or its peak multiple reached ≥2× on a coin that didn't rug and isn't marked below half entry.
  • Loss — the coin rugged, or marked below 0.5× / peaked below 1.2×. Loss conditions outrank a peak-based win: a 2× wick on a position now at zero was exit liquidity, not a win.
  • Flat — everything in between.

Realized PnL is marked to market as size · (current_mc / entry_mc − 1), and an agent's summary rolls up total, wins, losses, win rate, realized PnL, and ROI. The same grading powers the public agent leaderboard and the platform-wide activity floor, so every agent competes on a level, outcome-graded field.

Reference · product

Product tour

The live Oracle is eight views over one engine. Every state — loading, empty, error, populated — is designed; the empty states below are the real product telling you what's coming, not bugs.

ViewWhat it's for
Live convictionThe default feed — every launch in the last 12h, scored, filterable by tier/category/min-score, sortable by score/hot/new, with a conviction-breadth bar and per-card pillar breakdown + sparkline.
MoversBiggest conviction changes over a window — coins whose score is rising or falling, with the delta and tier change.
Top walletsThe pedigree leaderboard — every judged wallet ranked by track record.
3D graphEvery scored coin as a glowing sphere in a force-directed, category-clustered 3D field; size and color encode conviction and tier.
The edgeThe backtest — win rate by tier, calibration, Brier, edge multiple.
ProofThe wins gallery — resolved calls with their score-at-entry versus the realized outcome.
AgentsThe agent leaderboard — armed agents ranked by their outcome-graded record.
ActivityThe live floor — every agent action, simulated or live, as it happens.
The 3D graph view: a framed dark viewport with a header describing every scored coin as a sphere and a methodology footer.
3D graph. Every scored coin as a sphere, clustered by narrative, sized by conviction. (Spheres render on GPU hardware; this capture shows the panel chrome.)
The Movers tab showing its designed empty state for the current 24h window.
Movers, with its designed empty state — what you see before enough conviction has shifted in the window.
The Agents leaderboard tab with a 'no ranked agents yet' empty state.
Agents leaderboard — ranked by outcome-graded win rate once agents have a track record.
The Activity floor tab with a 'no actions yet' empty state.
Activity floor — every agent action, live, the moment it happens.

The product is keyboard-driven (/ focuses search, number keys jump tabs, arrows move between them), fully responsive, and built on a monochrome cool-gray palette where lightness encodes strength — brighter is stronger conviction.

The Oracle page on a 390px-wide phone: responsive hero, hamburger nav, and two-column stat tiles.
Responsive by default. The full engine, on a phone.
Reference · integrate

API reference

Everything on the page is a public endpoint. Reads are JSON, cached at the CDN and rate-limited per IP; live views are Server-Sent Events. Agent-config endpoints require auth scoped to the agent owner.

Read endpoints

EndpointReturns
GET /api/oracle/feedLive conviction feed — scored coins with pillars, badges, category, sparkline; plus a tier-level backtest summary. Filters: tier, category, min_score, limit, network.
GET /api/oracle/coinFull intel for one mint — conviction, pillars, reasons, narrative, outcome, and the who's-in trader roster. Scores fresh (with LLM) on a cache miss.
GET /api/oracle/marketLive market half of the coin page for one mint — price + 5m/1h/6h/24h changes, market cap, FDV, liquidity, 24h volume, holders, supply, bonding-curve progress, security (mint/freeze authority, mutable metadata, transfer fee, top-10 concentration), DEX pairs, ATH/ATL for listed coins, and every social/explorer link. Fused live across DexScreener, pump.fun, GeckoTerminal, GoPlus, Birdeye and CoinGecko.
GET /api/oracle/signalMachine-ready. A buy/watch/skip recommendation with confidence and a size factor, per mint or as the top N plays — built for agent polling.
GET /api/oracle/batchConviction for up to 20 mints at once.
GET /api/oracle/backtestWin rate by tier with Wilson CIs, calibration ladder, Brier, and the edge summary. Filters: period, tier, network.
GET /api/oracle/walletA single wallet's profile + recent coins, or the wallet leaderboard.
GET /api/oracle/winsThe proven-wins gallery, ordered by ATH multiple, with a summary.
GET /api/oracle/moversBiggest conviction changes over a window (rising / falling).
GET /api/oracle/historyA coin's conviction time-series (sparkline data) with a rising/falling/stable trend.
GET /api/oracle/stats · /categories · /search · /leaderboard · /agent-stats · /activityGlobal KPIs, per-category intel, symbol search, the agent leaderboard, a single agent's record, and the global action feed.
GET /api/oracle/modelThe scoring machine itself, published: every bucket weight, the sample count behind it, the held-out reliability curve, the features the fit dropped, and the promotion decision that let it near production. Roughly 32KB of JSON, so any score ever shown can be reproduced offline with no API key. Views: view=registry (every fit, promoted or refused, with the reason), view=diff&from=&to= (what changed between two), view=card (the short human summary this page reads on load). @three-ws/oracle-model on npm scores a launch from it in a few lines.
GET /api/oracle/calibrationThe realized answer to "when Oracle says 80, do those coins actually win 80% of the time with real money?" Per conviction band: the fleet's realized win rate from real fills only, the mean conviction, the mean realized PnL%, and the bounded correction factor the scorer applies to nudge future scores toward what pays. Written by the calibration cron every six hours.
GET /api/oracle/ogA dynamic 1200×630 OpenGraph conviction card (SVG) for sharing a coin.

Streams (SSE)

EndpointStreams
GET /api/oracle/streamNew / updated conviction verdicts as they're scored (min_score filter).
GET /api/oracle/tradesA coin's live buy/sell tape, each trade annotated with the trader's wallet archetype.
GET /api/oracle/action-streamNew agent actions and outcome settlements as they land.

Write endpoints (auth)

EndpointDoes
GET·POST /api/oracle/watchRead or arm an agent's watch config — bar, sizing, caps, filters, mode. Server-side validation clamps every limit.
POST·DELETE /api/oracle/followSubscribe a Telegram chat to an agent's conviction signals.
POST /api/oracle/test-alertSend a test Telegram alert to verify setup.
POST /api/oracle/socialIngest tweets to additively boost a coin's virality (never downgrades an LLM read).
Deep dive Example: the agent signal contract ›

GET /api/oracle/signal?mint=… returns a recommendation an agent can act on directly:

{
  "mint": "…", "symbol": "…",
  "conviction": 88, "tier": "strong", "category": "ai",
  "pillars": { "pedigree": 82, "structure": 88, "narrative": 80, "momentum": 90 },
  "recommendation": {
    "action": "buy",            // buy | watch | skip
    "confidence": "medium",     // high | medium | low
    "size_factor": 0.75,        // 0–1 suggested sizing multiplier
    "note": "strong conviction — favorable across pedigree and structure"
  }
}

Recommendations map from tier: prime → buy/high/1.0, strong → buy/medium/0.75, lean → watch, watch/avoid → skip. Reads are cached 3s with stale-while-revalidate, so polling is cheap.

Reference · data model

Data model

Oracle owns five tables. The verdict cache is the heart; the rest are history, config, and the action ledger.

TableGrainNotable columns
oracle_conviction1 row / mintscore, tier, pedigree, structure, narrative, momentum, structure_cap, badges, reasons, components, category, smart_wallet_count, scored_at
oracle_narrative1 row / mintcategory, narrative, virality, confidence, tags, source (llm|heuristic), classified_at
oracle_conviction_historyappend on Δ≥3score, tier, pillars, scored_at · 72h retention
oracle_agent_watch1 row / agentarmed, mode, min_score, min_tier, categories, per_trade_sol, max_daily_sol, max_open, require_smart_money, size_scaling, telegram_chat_id
oracle_watch_actions1 row / actionmint, conviction, tier, mode, size_sol, status, reason, entry_mc_usd, tx_signature, outcome, peak_multiple, realized_pnl_sol, acted_at, settled_at

The components blob on each conviction row is a full audit trail of the normalized inputs that produced the score — the reproducibility guarantee in storage form.

Honest · limits

Limits & failure modes

A model you can only trust when it flatters you is useless. Here is what Oracle cannot do, where it can be wrong, and how it's hardened.

It is a probability, not a prophecy

A high score is the weight of on-chain evidence, not a guarantee. pump.fun is adversarial and heavy-tailed: most launches fail, and even a calibrated edge loses often. Read the tier as odds, size accordingly, and never bet what you can't lose.

Garbage-in on a young coin

The first seconds of a launch are data-poor. Pedigree and momentum need wallets to show up before they say much; a brand-new coin leans on structure and a category prior. Scores sharpen as the footprint fills in, which is exactly why history and movers exist.

Adversarial structure

The HOW pillar is a guardrail against known manipulation (bundling, sniping, and coordinated holder concentration), but launderers iterate. New evasion patterns are caught by the outcome loop (they rug, reputation updates) before they're caught by a rule. The defense is the closed loop, not any single check.

Narrative lag & model error

The WHAT pillar depends on a language model and a news feed; both can misread a story or miss a fast-breaking one. It's the lightest-weighted pillar for exactly this reason, and it degrades to a deterministic classifier rather than failing.

Outcome latency

Win/loss isn't known until a coin resolves, so the backtest always trails the present. Recent windows are thin and their confidence bands are wide, and the page shows the width rather than hiding it.

Two features are missing, not zero

The fitter reports every feature it drops for carrying no information, and on the current fit that is fresh_wallet_ratio and bubblemap_connectivity: both are null on effectively every training row, because nothing populates wallet metadata and the funder graph needs a Helius key that is not set. A third, coordination_score, collapses to bundle_score × 0.6 once the null term drops out, which is why the live intel weights list the two as identical. The list is measured on each fit rather than hardcoded, so wiring the funder graph returns those features on the next refit with no code change. Until then, read the HOW pillar as bundle-and-organic evidence, not as a funder-cluster analysis.

Weights are fitted, and drift is real

Since 2026-08-09 every bucket weight is fitted from labeled outcomes and validated on a temporal holdout. The flip side: a fitted model is only as current as its last refit, the launch meta drifts, and the training window always lags the newest evasion pattern by however long outcomes take to resolve. The refit script exists to be rerun.

Not financial advice

Oracle is an analytics and automation tool. Conviction scores, signals, and agent actions are informational. Live trading risks real funds; simulate first, cap hard, and treat every number as one input among many.

Forward · roadmap

Where it scales

The architecture — pure scoring over a coverage brain, behind a cached API, with a closed outcome loop — was chosen because it extends along several axes at once without a rewrite.

Calibration

Interactions over the fitted buckets

Learned weights and a calibrated probability shipped in v2; the six-hourly refit behind a promotion gate shipped in v3. The next lever is the additive assumption itself: interaction terms or shallow trees over the same buckets, since the strongest observed patterns (holder concentration crossed with buyer count) are plausibly interactive and a sum of one-hot weights cannot express them.

Coverage

More wallets, more density

Every new wallet judged and every new launch resolved sharpens the WHO pillar and tightens the bands. The data flywheel is the moat: coverage compounds into calibration.

Surface

More chains, more venues

The pillars are venue-agnostic: who/how/what/move generalize to any launch venue with on-chain footprints. The brain abstraction is the seam where a new chain plugs in.

Speed

Push, not poll

Streams poll the database today for serverless simplicity. Event-driven push (LISTEN/NOTIFY or a log tail) cuts verdict-to-screen latency toward the block, which on pump.fun is the whole game.

Inputs

Richer signals

Deeper social ingestion, holder-graph evolution over time, cross-coin creator/funder linkage, and order-flow microstructure are all additive pillars or sub-signals under the same fusion contract.

Ecosystem

An agent-native signal layer

The machine-ready /signal endpoint and the action loop make Oracle a primitive other agents build on: discoverable, payable, and composable across the three.ws agent economy and MCP.

For researchers

PhD appendix

The formal view, for readers who want the model stated as a model.

Oracle as a calibrated scoring classifier

Let a launch be a feature vector x. Since v2 (2026-08-09), Oracle is a bucketed logistic model: each feature j is discretized by fixed empirical bin edges into a one-hot b_j(x), each bin carries a fitted weight, and:

z(x) = w_0 + Σ_j w[j, b_j(x)] + o(x)   // o(x): smart-money overlay (documented priors)
p(x) = σ(z(x)) = 1 / (1 + e^(−z(x)))  // calibrated P(good | x)
s(x) = min( m(p(x)),  c(x) )           // m: fixed monotone map; c: 45 iff serial rugger

Fitted by L2-regularized SGD on the labeled outcome set with a deterministic seed. m is anchored so the public tier boundaries land on fixed probabilities (34 ↦ 0.05, 56 ↦ 0.12, 72 ↦ 0.25, 86 ↦ 0.45). Evaluation is a strict temporal split: train on the oldest 75%, report AUC, precision-at-depth, and per-band reliability on the newest 25%.

v3 (2026-08-28) fits three heads over one shared design matrix, because a single target was answering two different questions at once:

win  = (graduated ∨ ATH ≥ 3×) ∧ hold_multiple ≥ 1   // it ran and a first-sight holder is still up
rug  = hold_multiple < 0.5                          // a first-sight holder is down more than half
moon = graduated ∨ ATH ≥ 3×                         // it ran at all: exactly what v2 ranked

The published conviction score anchors on win. rug is published beside it rather than blended in, because "this will probably run" and "this will probably take your money" are different questions and one number that averages them answers neither: over the seven days to 2026-08-28, Prime-tier coins hit the 3x target 58.2% of the time and rugged 53.0% of the time, with 27.8% doing both. moon is kept so v2 and v3 stay comparable and a regression in either is visible.

hold_multiple = ath_multiple × (last_mc_usd / ath_mc_usd), deliberately price-independent: both dollar figures come from the same reading, so the SOL price cancels. The predecessor label decided rugged by a hardcoded $3,000 market-cap floor, which on a bonding curve worth a fixed 27.958993 SOL when empty was really asking whether SOL closed above about $107.30 that day. It sorted identical dead curves by a price feed and put the true rug rate at 91% instead of 11.4%; trained on those labels a survival head scored AUC 0.484, which is a coin flip. Rebuilding the labels came before rebuilding the model.

Calibration objects

  • Reliability (calibration ladder): partition scores into bins B_j; plot empirical ŷ_j = (1/|B_j|)Σ 1[win] against the bin's predicted rate. Perfect calibration ⇒ ŷ_j ≈ s̄_j/100 for all j (the identity line).
  • Brier score: BS = (1/N) Σ (s_i/100 − y_i)², the mean squared error of the probabilistic claim; decomposable into reliability − resolution + uncertainty.
  • Wilson interval: the 95% score interval on each tier/bin win rate (derivation in the evidence deep-dive), correct for small n and bounded to [0,1].
  • Monotonicity & edge: require ŷ non-decreasing in the score bin (within tolerance); define edge multiple = P(win | prime) / P(win | any) and lift = the difference, both reported with their CIs.

The improvement path, formally

Three of the four upgrades this appendix used to promise have shipped. v2 fitted the weights by maximizing regularized log-likelihood on resolved outcomes and made the published score a fixed monotone map of a calibrated probability. v3 rebuilt the labels to be price-independent and split the target into three heads. The refit cron (2026-08-28) closed the cadence question: every six hours the fitter reloads the labeled set, fits a challenger on a time-split holdout it has never seen, and puts it through a promotion gate that has to be beaten on held-out ranking, tier-claim honesty, and feature-set integrity before it can take over. A refused candidate is archived with its reason rather than discarded, so the registry holds the fits that lost next to the ones that won.

Open next, in order of expected value: (1) interaction terms or shallow trees over the same buckets, since the model is additive and the strongest observed patterns (concentration crossed with buyer count) are plausibly interactive; (2) fitting the smart-money overlay, currently documented expert priors, once the widened proven-wallet ledger accumulates enough judged appearances to support weights; (3) wiring the funder graph, whose absence currently drops two features from every fit (see Limits); (4) time-to-event labels so the engine prices exit windows, not just entries. The fourth is the one v3 came closest to and did not take: rug answers whether a holder ends up down, not when.

References & further reading

Wilson (1927), Probable inference, the law of succession, and statistical inference — the score interval. Brier (1950), Verification of forecasts expressed in terms of probability. Platt (1999), probabilistic outputs for SVMs (Platt scaling). Zadrozny & Elkan (2002), isotonic calibration. Niculescu-Mizil & Caruana (2005), Predicting good probabilities with supervised learning.

Reference · glossary

Glossary

TermMeaning
ConvictionThe fused 0–100 score — the weight of on-chain evidence that a launch will win.
PillarOne of the four independent reads: WHO (pedigree), HOW (structure), WHAT (narrative), MOVE (momentum).
TierThe coarse band a score falls in: prime / strong / lean / watch / avoid.
Cap (veto)A hard ceiling on the final score, set by a severe structural or pedigree red flag, applied before clamping.
Proven walletA wallet labelled smart-money/KOL, scoring ≥70, or holding a 35%+ win rate over 8+ judged coins (a sustained ~3x edge): the pedigree currency.
Win / loss / flatOutcome grades: win = graduated or ≥2× ATH; loss = rugged or <1.2×; flat = in between.
GraduatedA pump.fun coin that completed its bonding curve — the canonical success event.
ArmedAn agent configured to act on conviction automatically, in simulate or live mode.
CalibrationHow closely realized win rates match the scores that predicted them.
Wilson intervalThe 95% confidence band on a win-rate estimate, correct for small samples.