System Status
Public health of Orrery's data sources, freshness checks, data-quality notices, Kalshi preview state, and incidents.
Build v4.01 · e04f30d · changelog · last entry 2026-05-09 · public roadmap
Sources up
2/2
Open issues
0
Latency over budget
0
x402 endpoints
24
Prod blockers
0
Kalshi realtime
REST preview
Production readiness
READYProduction readiness passes with 3 warnings. Machine-readable gate: /api/status/readiness.
- LLM explanationsWARN
Optional LLM integration is off, so explain and Copilot routes use deterministic fallback heuristics.
- Telegram deliveryWARN
Optional Telegram channel is disabled until Telegram delivery is configured; email and signed webhooks are unaffected.
- Discord deliveryWARN
Optional Discord channel is disabled until Discord delivery is configured; email and signed webhooks are unaffected.
Data quality contract
PASSPublic trust checks for freshness, market-status consistency, stale fallback prevention, and share-card quality. Automated check: npm run check:trust-foundation.
Top live markets carry fresh timestamps inside the public SLA.
Expired markets cannot render as LIVE; rail-pinned markets cannot render as resolved.
No active data-quality notices on the public status surface.
Public SSR HTML is clean: no stale queue rows or loading chrome detected.
/api/status/ops and /api/status/readiness are available for monitors.
Product copy is constrained to observation, verification, resolution risk, and not-trade-advice language.
Brief, market detail, source-drop, alert, and share surfaces guide users from observation to verification instead of leaving raw prices as the answer.
All systems operational
Last checked Jun 9, 00:45 UTC
Polymarket Gamma API
Probed Jun 9, 00:45 UTC
25ms latency
Polymarket CLOB API
Probed Jun 9, 00:45 UTC
37ms latency
Agent API · x402
24 endpointsPaid per-call market context 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
Showing the first 10 endpoints here. Full machine-readable catalog: /.well-known/x402-services.json.
Free health-check at /api/x402/v1/health · Discovery → /docs/agents
x402 endpoint latency
persistent| Endpoint | Samples | p50 | p95 | p99 | Target | Last seen |
|---|---|---|---|---|---|---|
| /api/x402/v1/events | 256 | 65ms | 151ms | 221ms | 500ms | Jun 9, 00:07 UTC |
| /api/x402/v1/health | 256 | 37ms | 126ms | 155ms | 150ms | Jun 9, 00:07 UTC |
| /api/x402/v1/divergence/top | 185 | 23ms | 139ms | 305ms | 1800ms | Jun 8, 06:18 UTC |
| /api/x402/v1/markets | 181 | 23ms | 148ms | 239ms | 800ms | Jun 8, 06:17 UTC |
| /api/x402/v1/brief/today | 177 | 22ms | 88ms | 182ms | 800ms | Jun 8, 07:53 UTC |
| /api/x402/v1/decision/attention | 167 | 21ms | 79ms | 198ms | 900ms | Jun 8, 06:17 UTC |
| /api/x402/v1/decision/market/{id} | 159 | 22ms | 43ms | 58ms | 1500ms | Jun 8, 06:17 UTC |
| /api/x402/v1/markets/movers | 153 | 21ms | 43ms | 238ms | 600ms | Jun 8, 06:17 UTC |
| /api/x402/v1/signals | 153 | 20ms | 56ms | 360ms | 800ms | Jun 8, 06:18 UTC |
| /api/x402/v1/search | 152 | 23ms | 56ms | 200ms | 500ms | Jun 8, 06:17 UTC |
| /api/x402/v1/trades/recent | 152 | 22ms | 41ms | 202ms | 600ms | Jun 8, 06:17 UTC |
| /api/x402/v1/markets/{id}/snapshot | 151 | 21ms | 76ms | 238ms | 600ms | Jun 8, 06:17 UTC |
Showing the first 12 endpoint samples, sorted by budget pressure and volume. p95 highlighted amber when above the published target. 256-sample ring buffer per endpoint; older samples evict.
Kalshi preview state
REST PREVIEWWorker is refreshing public Kalshi REST orderbook snapshots into KV. WebSocket streaming still requires Kalshi API credentials.
Storage
kv
Preview status
rest_preview
Stored markets
16
Last ticker
KXLPBGAME-26JUN121400BLIPOR-BLI
Last seen
13s
Read-only Kalshi market-data preview. It does not place orders, read balances, or connect to trading accounts. JSON status: /api/venues/kalshi/realtime · last heartbeat Jun 9, 00:45 UTC.
Uptime — last 90 days
persistentPer-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.
Delivery freshness
persistentPublic delivery and data refresh jobs stamp their last successful run so brief, alerts, large-trade context, source probes, and Kalshi preview state cannot silently go stale.
- freshDaily brief deliveryevery 24.0hlast run Jun 8, 12:00 UTC
Email delivery only: the public /brief page is generated separately and can be fresh while inbox delivery is degraded.
- freshAlerts deliveryevery 5mlast run Jun 9, 00:45 UTC
Evaluates server-eligible rules against the current snapshot and delivers email or signed webhook notifications.
- freshLarge-trade ingestevery 10mlast run Jun 9, 00:40 UTC
Refreshes large-trade context from public venue data so wallet and flow pages stay current.
- freshUpstream status probeevery 5mlast run Jun 9, 00:40 UTC
Checks upstream source health and opens or resolves public data-quality incidents.
- freshKalshi REST previewevery 5mlast run Jun 9, 00:45 UTC
Refreshes public Kalshi REST snapshots while WebSocket streaming remains private beta.
Data-quality incidents
0 recordedSeparate 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 persisted data-quality incidents recorded.
Upstream incident history
current OKCurrent upstream probes are healthy. Rows below are resolved external API blips kept for audit history, not active data-quality problems. Storage: persistent.
- RESOLVEDWAS DEGRADEDPolymarket CLOB API probe failedJun 6, 23:35 UTC → Jun 6, 23:40 UTCpolymarket-clob · fetch failed
- RESOLVEDWAS DEGRADEDPolymarket Gamma API probe failedJun 6, 23:35 UTC → Jun 6, 23:40 UTCpolymarket-gamma · fetch failed
- RESOLVEDWAS DEGRADEDPolymarket CLOB API probe failedJun 6, 07:01 UTC → Jun 6, 07:04 UTCpolymarket-clob · fetch failed
- RESOLVEDWAS DEGRADEDPolymarket Gamma API probe failedJun 6, 01:25 UTC → Jun 6, 01:32 UTCpolymarket-gamma · The operation was aborted due to timeout
- RESOLVEDWAS OUTAGEPolymarket Gamma API probe failedJun 6, 01:10 UTC → Jun 6, 01:20 UTCpolymarket-gamma · The operation was aborted due to timeout [promoted to outage after 3 consecutive failed probes at 2026-06-06T01:19:13.113Z]
- RESOLVEDWAS DEGRADEDPolymarket Gamma API probe failedJun 6, 01:00 UTC → Jun 6, 01:05 UTCpolymarket-gamma · The operation was aborted due to timeout
- RESOLVEDWAS OUTAGEPolymarket Gamma API probe failedJun 6, 00:40 UTC → Jun 6, 00:55 UTCpolymarket-gamma · The operation was aborted due to timeout [promoted to outage after 3 consecutive failed probes at 2026-06-06T00:50:43.106Z]
- RESOLVEDWAS DEGRADEDPolymarket CLOB API probe failedJun 5, 20:40 UTC → Jun 5, 20:45 UTCpolymarket-clob · The operation was aborted due to timeout
- RESOLVEDWAS DEGRADEDPolymarket CLOB API probe failedJun 5, 17:15 UTC → Jun 5, 17:20 UTCpolymarket-clob · The operation was aborted due to timeout
- RESOLVEDWAS DEGRADEDPolymarket CLOB API probe failedJun 5, 16:35 UTC → Jun 5, 16:40 UTCpolymarket-clob · The operation was aborted due to timeout
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 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.
Showing the latest 12 entries. Full shipped history lives on the public roadmap.
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.