Status

System Status

Live probes of every upstream Orrery depends on. Refreshed on every page load, with incidents and x402 latency on the same surface.

All systems operational

Build v4.01 · 19f51a9 · changelog · last entry 2026-05-09 · public roadmap

Sources up

2/2

Open incidents

0

Latency over budget

1

x402 endpoints

23

Prod blockers

0

Kalshi realtime

No heartbeat

Production readiness

READY

Production readiness passes with 3 warnings. Machine-readable gate: /api/status/readiness.

  • LLM explanationsWARN

    Optional LLM integration is off: ANTHROPIC_API_KEY is absent, so explain and Copilot routes use deterministic fallback heuristics.

  • Telegram deliveryWARN

    Optional Telegram channel is disabled until TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID are set; email and signed webhooks are unaffected.

  • Discord deliveryWARN

    Optional Discord channel is disabled until DISCORD_WEBHOOK_URL is set; email and signed webhooks are unaffected.

All systems operational

Last checked May 18, 02:53 UTC

GREEN

Polymarket Gamma API

Probed May 18, 02:53 UTC

OK

50ms latency

Polymarket CLOB API

Probed May 18, 02:53 UTC

OK

46ms latency

Agentic Intelligence API · x402

23 endpoints

Paid per-call intelligence at /api/x402/v1/* for autonomous AI agents. Inherits the same upstream health as the surfaces above; if any source is DOWN, the x402 endpoints depending on it will degrade.

  • GET /api/x402/v1/decision/attention$0.050
  • GET /api/x402/v1/decision/market/{id}$0.150
  • GET /api/x402/v1/brief/today$0.010
  • GET /api/x402/v1/markets/movers$0.005
  • GET /api/x402/v1/venues$0.000
  • GET /api/x402/v1/markets$0.005
  • GET /api/x402/v1/divergence/top$0.050
  • GET /api/x402/v1/markets/{id}/snapshot$0.005
  • GET /api/x402/v1/markets/{id}/why$0.020
  • GET /api/x402/v1/markets/{id}/resolution-risk$0.010
  • GET /api/x402/v1/events/{slug}/cluster$0.030
  • GET /api/x402/v1/signals$0.010
  • POST /api/x402/v1/watchlist/summary$0.050
  • POST /api/x402/v1/portfolio/risk$0.050
  • GET /api/x402/v1/share-card/{slug}$0.030
  • GET /api/x402/v1/wallets/{address}$0.020
  • GET /api/x402/v1/category/{slug}/intelligence$0.020
  • GET /api/x402/v1/backtest/{kind}$0.020
  • GET /api/x402/v1/search$0.005
  • GET /api/x402/v1/events$0.005
  • GET /api/x402/v1/signals/{kind}$0.010
  • GET /api/x402/v1/trades/recent$0.005
  • GET /api/x402/v1/health$0.000

Free health-check at /api/x402/v1/health · Discovery → /docs/agents

x402 endpoint latency

persistent
EndpointSamplesp50p95p99TargetLast seen
/api/x402/v1/health5230ms110ms133ms100msMay 18, 01:24 UTC
/api/x402/v1/events11318ms152ms269ms500msMay 18, 01:24 UTC
/api/x402/v1/brief/today3019ms68ms182ms800msMay 18, 01:21 UTC
/api/x402/v1/decision/attention2818ms37ms38ms900msMay 18, 01:21 UTC
/api/x402/v1/decision/market/{id}2719ms32ms45ms1500msMay 18, 01:21 UTC
/api/x402/v1/markets/movers2619ms39ms217ms600msMay 18, 01:21 UTC
/api/x402/v1/markets/{id}/snapshot2618ms39ms238ms600msMay 18, 01:21 UTC
/api/x402/v1/markets/{id}/why2616ms173ms227ms1500msMay 18, 01:21 UTC
/api/x402/v1/markets/{id}/resolution-risk2619ms52ms159ms600msMay 18, 01:21 UTC
/api/x402/v1/events/{slug}/cluster2618ms189ms622ms900msMay 18, 01:21 UTC
/api/x402/v1/signals2616ms57ms360ms800msMay 18, 01:21 UTC
/api/x402/v1/watchlist/summary2617ms38ms55ms1200msMay 18, 01:21 UTC
/api/x402/v1/portfolio/risk2618ms58ms183ms1500msMay 18, 01:21 UTC
/api/x402/v1/share-card/{slug}2617ms37ms39ms700msMay 18, 01:21 UTC
/api/x402/v1/wallets/{address}2618ms31ms31ms900msMay 18, 01:21 UTC
/api/x402/v1/category/{slug}/intelligence2617ms38ms556ms1000msMay 18, 01:21 UTC
/api/x402/v1/backtest/{kind}2616ms61ms106ms600msMay 18, 01:21 UTC
/api/x402/v1/search2620ms70ms174ms500msMay 18, 01:21 UTC
/api/x402/v1/signals/{kind}2617ms39ms51ms700msMay 18, 01:21 UTC
/api/x402/v1/trades/recent2619ms27ms202ms600msMay 18, 01:21 UTC
/api/x402/v1/venues93ms13ms13ms120msMay 18, 01:21 UTC
/api/x402/v1/divergence/top921ms72ms72ms1800msMay 18, 01:21 UTC
/api/x402/v1/markets820ms77ms77ms800msMay 18, 01:21 UTC

p95 highlighted amber when above the published target. 256-sample ring buffer per endpoint; older samples evict.

Kalshi realtime worker

NO HEARTBEAT

KV is available, but the Kalshi realtime worker has not written a heartbeat yet.

Storage

kv

Worker status

missing

Stored markets

0

Last ticker

Last seen

Read-only WebSocket monitor for Kalshi orderbook depth. It does not place orders, read balances, or connect to trading accounts. JSON status: /api/venues/kalshi/realtime.

Uptime — last 90 days

persistent
100.00%last 90 days
90ok
2026-02-18today

Per-day worst-severity rollup of the persistent incident log (all components, all kinds). Operational % counts both incident-free days and days with informational notices. Hover a cell to see the date and the incidents that touched it.

Per-component upstream uptime

Same 90-day window, restricted to upstream_probe incidents and decomposed by upstream so a Gamma outage doesn't mask a CLOB-only outage in the aggregate strip above.

Polymarket Gamma
100.00%
Polymarket CLOB
100.00%
Polymarket Data API
100.00%
Snapshot pipeline
100.00%

Cron freshness

persistent

Each server-side cron stamps its lastRunAt + lastSuccessAt on completion. Badge flips amber if a tick is overdue by 1.5× its cadence, red at 3× or after a failure. Surfaces silent cron stoppages before downstream data goes stale.

  • freshDaily brief deliveryevery 24.0hlast run May 17, 12:00 UTC

    Builds the daily brief and sends subscriber email plus optional Telegram / Discord summaries.

  • freshAlerts deliveryevery 5mlast run May 18, 02:50 UTC

    Evaluates every server-eligible rule against the current snapshot; sends email digests + signed webhooks for fired rules.

  • freshWhale-trade ingestevery 10mlast run May 18, 02:50 UTC

    Pulls fresh $5k+ trades from Polymarket's public Data API and appends to the persistent ledger.

  • freshUpstream status probeevery 5mlast run May 18, 02:50 UTC

    Probes Polymarket Gamma + CLOB upstreams every 5 min; opens incident-log rows on probe failure, resolves them on recovery. Drives the uptime strip.

Data-quality incidents

0 recorded

Separate feed from upstream HTTP probes: rows here track content-quality regressions caught by Orrery's own invariants (e.g. tape-event counters going to zero, taxonomy buckets leaking, snapshot-id drift). An upstream API can be green while our derived data is wrong — this feed surfaces that distinction publicly.

No data-quality incidents recorded.

Upstream incident history

persistent

No upstream incidents recorded.

The upstream probe loop writes incidents automatically when Gamma, CLOB, or Data API checks fail and resolves them on recovery. Operators can still POST a manual backfill from a runbook for external or historical events.

Changelog

28 entries
  • rule changev4.01 — /scanner default view filters to live_research bucket2026-05-09

    Pipes the 200 active markets through `partitionByBucket()` and keeps only `live_research`. Excludes resolution-watch markets (UMA pending, expired but not closed, within 72h of expiry) and settled markets (closed, pinned ≤1¢/≥99¢ with real volume). A Bundesliga match that ended hours ago and is awaiting Oracle confirmation no longer pollutes the "what to research now" surface — those still live on /opportunities Resolution tab and /signals Resolution Watch view. Summary KPIs recompute over the live-research subset so the chip row matches the table.

  • releasev4.00 — chart hover crosshair + rich tooltip + density tokens align2026-05-09

    InspectorChart on /scanner /signals /opportunities now responds to cursor: vertical dashed crosshair guide spans the canvas, a 2px dot tracks the price line at the interpolated y, and a styled tooltip anchored to cursor x renders price (interpolated, in tone colour), relative-ago time, nearest volume bucket (compact $X.Yk/M), and any event labels within 2% of the timespan. Auto-flips left/right at 60% width to stay in-plot. Synthetic-fallback mode hides the tooltip entirely (no real timestamps to honestly label). The shell's existing density toggle (`data-density="dense"`) now drives the v3.98 `--space-*` tokens too, shrinking padding globally.

  • releasev3.99 — WalletInspector + WalletsExplorer split-view (/wallets joins workbench pattern)2026-05-09

    /wallets refactored from inline cards+table → ScannerSplitView. Desktop: row click selects into right-rail WalletInspectorPane via SelectionProvider context (paramKey="wallet"). Mobile keeps existing card→detail navigation. Inspector renders five 0..100 quality dimensions (Activity / Performance confidence / Specialisation / Early-entry / Copy risk) as inline progress bars with green/amber/red tone, plus an insufficient-sample warning when winRateSample<3 with open>$25k OR copyRiskScore≥60. Five inspectors now share one chrome — Trade / Market / Signal / Opportunity / Wallet.

  • releasev3.98 — premium primitives (Skeleton + AnimatedNumber + Tooltip + LiveRefresh)2026-05-09

    Sprint A (visual foundation) + Sprint B (live feel) shipped together. Skeleton primitive (CSS shimmer, no deps, prefers-reduced-motion respected). AnimatedNumber primitive (requestAnimationFrame tween 280ms easeOutCubic, optional flashOnChange green/red glow on direction). Tooltip primitive (zero-dep, viewport edge auto-flip, Esc dismiss). LiveRefresh component — auto router.refresh() every 30s, "Updated Xs ago" pulse, pause/play toggle persisted in localStorage, visibility-API aware (backgrounded tab doesn't burn refreshes). Density tokens (--space-tight / -base / -relax + --type-display / -h2 / -body / -meta / -micro). Wired into /scanner price column (animated + flashOnChange), DataConfidencePill (styled tooltip with score+tier+factor breakdown), InspectorChart current-cents chip, /scanner data-meta strip.

  • rule changev3.97 — alerts copy drift fix on Market Detail + /scanner toolbar count clarity2026-05-08

    AlertBuilder on Market Detail page hard-coded "Email, Telegram, Discord delivery are coming soon" + email channel disabled — outdated since RESEND was wired. Now `emailDeliveryLive` prop drives both copy and chip availability: when true, "Email digests are wired to a server-side cron and continue while your tabs are closed"; when false, dry-run language. /scanner toolbar count line read "100 markets" while KPI showed 200; now renders "Showing X of N markets" when slice is smaller than universe.

  • rule changev3.96 — alerts CTA reflects production state, history cap 50→2002026-05-09

    Threads serverDeliveryLive (=RESEND_API_KEY set) into AlertsCreate. Until any out-of-browser channel is wired, every rule is effectively local-only — server-eligible rules are stored, the cron logs them in dry-run mode, no email leaves. CTA + card title + subtitle reflect this honestly: serverDeliveryLive=false → "Create local alert" / "In-app only · email dry-run"; serverDeliveryLive=true + server-eligible condition → "Create alert". Local triggered-history cap raised 50→200; display window 20→50.

  • releasev3.95 — public proof + observation copy consistency2026-05-08

    Sprint A (public proof) + Sprint D (copy consistency). Build line directly under the /status page header — "Build vX.YZ · <short-sha> · changelog · last entry <date>" reading commit SHA from VERCEL_GIT_COMMIT_SHA. Lets an external auditor cross-reference a /status snapshot against a specific deploy. Copilot "momentum signal active" → "momentum observation active" (last surface that hadn't migrated in v3.40). Brief intro paragraph, metadata.description, JSON-LD WebPage description, FAQ Q&A, markdown export, OpenGraph image, BriefView + PersonalBriefView empty states all flipped from "research signals" → "research observations".

  • releasev3.94 — chart primitive shared across /scanner /signals /opportunities + alerts plural fix2026-05-08

    InspectorChart (mid-size probability line, real CLOB ticks, volume bars, event markers, 1D/7D/30D/ALL toggle) now lives inside the right-rail inspector on three pages, not just /scanner. The chart fetches /api/markets/[slug]/history once on selection (60s revalidate) and overlays whale trades ≥ $5k, signal firings deduped by kind+day, expiry, and current UMA state on the line. Bundle: chart moves into a shared chunk so /scanner's per-page payload drops 15.2 → 12.7 kB. Pluralization fix for the email-digest count: "0 rule s eligible" rendered with a stray space across multi-line JSX; folded into a single template-string expression.

  • releasev3.93 — InspectorChart Phase 3 (volume bars + event markers)2026-05-08

    The /api/markets/[slug]/history route now returns { points, volumeBuckets, events } in a single round-trip. Volume bars normalised against the heaviest bucket so the shape stays honest across markets that vary by orders of magnitude. Event markers — whale ◆ / signal ● / expiry ▲ / UMA ◆ — anchored to the same (firstSec → lastSec) x-axis as the price line, with `<title>` hover for label + detail. Foot strip gains a marker legend (shape-coded so the reader can map legend → chart by shape alone, no colour reading required) and a total-volume figure for the visible window.

  • releasev3.92 — Inspector chart Phase 3 part 1 (real CLOB history + range toggle + keys)2026-05-08

    Inspector chart now fetches tick-by-tick CLOB price history per (slug, interval) with a 1D/7D/30D/ALL range toggle. Per-mount cache prevents re-fetches when toggling back to a previously-viewed range. Synthetic 4-anchor curve stays as the loading-state fallback at 0.55 opacity so the panel never paints empty. /scanner keyboard nav: ArrowUp / ArrowDown alongside j / k; Escape closes the inspector + clears the URL `?market=` param.

  • releasev3.91 — Inspector polish (pluralization + info icon + empty-state)2026-05-08

    Five JSX-whitespace pluralization bugs across market-table ("100 market s"), personal-brief-view ("1 market s watched"), portfolio-view ("1 categor / ies"), watchlist-import-prompt ("Import N market / s"). All folded into single template-string expressions so the noun + plural suffix stay glued. Category trace trigger character `?` replaced with the standard lucide Info icon for consistency with canonical-status / data-confidence affordances. Inspector empty-state copy now mentions the 7-day probability chart so a first-time user knows what they'll see when they click a row.

  • releasev3.90 — Markets Inspector redesign (chart on top + tabs)2026-05-08

    Right-rail inspector restructured: Header → mid-size probability chart → KPI strip → primary insight → tabs (Overview / Resolution / Related) → sticky footer. Tabs replace the prior flat scroll-of-sections so the inspector reads as panels, not a list. Tab strip is keyboard-navigable (Arrow Left / Right cycle, Home / End jump). Chart tone is canonical-status-aware: rail-pinned + UMA-pending → amber, resolved → muted, live → green or red by 1w direction.

  • rule changev3.89 — Sprint 1 design stabilization (legal/court taxonomy + copy fixes)2026-05-08

    Twelve new byPattern entries in category-overrides (epstein / guilty verdict / indictment / convicted / sentenced / case dismissed / SCOTUS ruling / DOJ release / FBI release / Congressional release) so legal/court markets stop classifying as Unclassified. +8 regression tests. Brief per-section share button now icon-only (literal "Share" word inline read as a stray CTA in editorial flow). Market Detail timeline label "Resolve" → "Scheduled resolution" (noun event vs. verb imperative). /backtest "3 categor / ies" JSX whitespace bug fixed. /alerts presets now carry an inline `local` pill on whale_trade / signal_fired entries.

  • releasev3.88 — magic-link auth + synced watchlist (Sprint 5)2026-05-08

    Account-light identity using HMAC-signed magic links: pair an email once, get a 90-day HttpOnly cookie. Synced watchlist mirrors browser state to the server keyed by sha256(email). Cron alert evaluator expands watchlist-target rules against the synced state, so price/expiry/volume/UMA-status conditions on watchlist rules now fire from the server — not just while a tab is open. Five new routes (/api/auth/request-link, /verify, /sign-out, /me + /api/watchlist/sync). +11 invariants for token sign/verify roundtrip, expired rejection, tampered-payload rejection, cookie roundtrip, user store CRUD, watchlist sanitisation. Activates on env-flip: AUTH_SECRET (32-char) + KV + RESEND. Until then dry-runs to structured logs + in-memory KV; UI surfaces dry-run state honestly.

  • releasev3.87 — /alerts UX honesty pass (Sprint 1 of audit)2026-05-08

    Production-readiness banner at the top of /alerts (green when server delivery wired, amber otherwise) with per-channel chip row tagged active / dry-run / client-side only / not connected. Server-eligibility badge in the rule builder Step 2; Email channel button per-rule tagged server-side / local-only based on kind/target. CTA copy switches to "Create local alert" when the rule is local-only. Webhook collapsed section now has a "client-side only" pill in the title. Drops the "scaffolded · dry-run" / "channel unset" / "webhook unset" jargon.

  • releasev3.86 — /whales Trade Inspector split-view2026-05-08

    Replaces the modal-only WhaleDrawer pattern with a persistent right-rail inspector via ScannerSplitView, mirroring /scanner /signals /opportunities. Selection lives in SelectionProvider context (paramKey="trade") — row click sets state directly and mirrors `?trade=<key>` via replaceState, no server roundtrip. Below lg the inspector hides and a fallback WhaleDrawer modal renders the selected trade.

  • rule changev3.85 — /whales context chips + wallet label fix2026-05-08

    Each /whales row now carries a context chip — Live move / Settlement-like / Rail-pinned / Near expiry / UMA pending / Low-liq impact / Unknown — derived from canonical status + price + liquidity so the reader doesn't misread settlement housekeeping as directional alpha. Inspector primary-insight tone matches the chip. Wallet-label spec fix: pseudonym always preferred over short address, with clear fall-through.

  • rule changev3.42 — canonical status-copy formatter (Sprint 1 audit follow-up)2026-05-06

    Single shared formatter (`lib/status-copy.ts`) now owns every user-facing string derived from MarketStatus across Markets table, Detail timeline, Brief, and the x402 API. Hard invariant pinned: only RESOLVED_YES + RESOLVED_NO render the verb "resolved"; UMA_PENDING / UMA_DISPUTED / EXPIRED_UNRESOLVED / ARCHIVED do not. 15-invariant status × surface regression test prevents drift. Resolves the audit's last P0 trust-copy bug.

  • releasev3.41 — dashboard scroll fix + UMA-pending wording cleanup2026-05-06

    Fixed home dashboard scroll: .ov2 used min-height:100% so content past viewport made the topbar scroll away; switched to height:100% so the inner .ov2-page overflow:auto scroll architecture activates as designed. UMA-pending markets in the Markets table no longer falsely labelled "Resolved" in the expiry column; Detail timeline no longer says "Market resolved Xh ago" for UMA-proposed markets — instead reads "Expiry passed Xh ago; awaiting UMA confirmation".

  • releasev3.40 — observation copy + snapshot family + category trace popover + queue sorting + Brief Quality Score2026-05-06

    Five surfaces touched: (1) signal → observation copy across Detail / Dashboard / /signals / /receipts / Brief; (2) snapshotFamilyFor / snapshotsAreSiblings / snapshotMinutesApart helpers for diagnosing minute-level snapshot drift across surfaces; (3) Why-this-category click-popover in Markets table (computes the deterministic engine trace server-side, ships only display markup to the client); (4) Research Queue gains four explicit sort modes — most-urgent / highest-evidence / lowest-ambiguity / best-backtest; (5) Brief Quality Score 0..100 composite across freshness, category confidence, resolution clarity, and backtest support.

  • releasev3.39 — Sprint 2-5 reliability + persistent foundations (code-side)2026-05-06

    Stripe-style HMAC-SHA-256 webhook signing via X-Orrery-Signature with replay-window verification. Delivery audit log (capped at 1000 entries) + postWithRetry helper with exp backoff and Retry-After honoring. Typed incident kinds (upstream_probe / data_quality / snapshot_mismatch / schema_drift / manual) + pruneIncidents with 90-day retention. Signal firing history with (snapshot, kind, slug) dedup. x402 catalog × filesystem parity test (20↔20 routes), 24-invariant catalog contract test, p50/p95/p99 latency ring buffer with measureLatency wrapper.

  • rule changev3.38 — taxonomy regression fixes (Judy Shelton / SPX / aliens)2026-05-06

    Three Markets-table classification failures fixed: (1) Judy Shelton Fed Chair confirmation → Politics (was Sports — common surname collision with tennis player Ben Shelton); (2) S&P 500 (SPX) Opens Up or Down → Macro (was Unclassified — no equity-index keywords); (3) Will the US confirm aliens exist before 2027 → Science (was Unclassified). Added 16 byPattern overrides covering Fed governance, equity indices, UFO/extraterrestrial. Removed ambiguous tennis surnames (shelton/sinner/fritz/ruud/medvedev) from sports hard markers — tennis still classifies via venue + tour markers + unique surnames.

  • releasev3.37 — lib unit-test coverage closeout (446 invariants, 22 files)2026-05-06

    Closed the lib coverage gap from the audit. Eight new test files: resolution.ts (extractResolutionSource regex coverage), polymarket.ts (normalizeMarket from raw Gamma response), data-api.ts (normalizeTrade), decision-card.ts (confidenceLabel/severityLabel ordinal tiers), whale-ledger.ts (txHash idempotency, wallet aggregation), server-alerts.ts (rule-kind boundary semantics), public-watchlists.ts (slug/title/author cap rules), signals.ts (flow/momentum/divergence/resolution_risk thresholds).

  • releasev3.36 — doubled test coverage + smoke tests (262 invariants)2026-05-06

    Six new test files: subcategories taxonomy routing (45 tests), opportunities axes + workflow router (30), signal calibration tiers (22), Top Actions priority + observation wording (10), dashboard panel composition (23), API smoke against live x402 endpoints (8). Reordered subcategories switch (TENNIS → F1 → ESPORTS → FOOTBALL → SOCCER) and space-anchored ticker patterns to prevent collisions like 'eth' eating 'method 1'.

  • releasev3.32.3 — full panel data wiring + audit P1 fixes2026-05-06

    Home dashboard now wired to live snapshot. Daily Brief gained an executive Today's-3 hero plus Verify / Likely-noise / Risk-increased tri-digest. Research Queue split Risk → Priority + Resolution risk + Score confidence. Server-side alert subscription endpoint, cron evaluator, and Resend / webhook delivery code paths SCAFFOLDED — current production deploy still runs in dry-run mode (RESEND_API_KEY not configured). Persistent incident log scaffold ALSO in dry-run (KV not configured).

  • pricing changedecision_market endpoint copy clarified — bundle, not discount2026-05-06

    Removed the misleading "cheaper than the three deep calls separately" claim on /api/x402/v1/decision/market/{id}. Pricing is unchanged at $0.150 USDC/call; copy now reflects that the bundle is for completeness + one-round-trip latency, not a discount over fanning out base endpoints.

  • rule changeTaxonomy v2 — sports/tennis deterministic rules2026-05-06

    Added 25+ deterministic byPattern overrides for ATP / WTA / Wimbledon / US Open / Roland Garros / Australian Open / Champions League / Premier League / La Liga / Serie A / Bundesliga / NFL / NBA / MLB / NHL / NCAA / Super Bowl / UFC. Crypto ETF disambiguation. Tennis matches that previously rendered as Unclassified now classify as Sports.

  • releasev3.32 shell — ov2 dashboard + new chrome2026-05-05

    Replaced the v3.21 ds-* terminal grid on the desktop home with the ov2 dashboard. Added 200px LeftRail with grouped nav (Primary / Intelligence / Tools), orbit illustration, account block. Top bar gained a snapshot label, snapshot id, and KPI strip (live markets, resolutions <72h, 24h volume, data confidence).

How this page works

  • Each row performs a live HTTP probe against the upstream endpoint when you load this page. Latency is the round-trip time of that probe.
  • OK means the upstream returned a 2xx response. DOWN means the probe failed or returned a non-2xx status.
  • Data freshness on individual pages is surfaced under each card (e.g. “updated 23s ago · source: Polymarket Gamma”). Orrery caches upstream responses for 60 seconds.