Roadmap

What's shipped, in progress, and planned

Pulled from the same persistent changelog the /status page uses, so the public roadmap and the production deploy are never out of sync. “Planned” items don't promise dates — if something sits here for more than ~2 months, it either ships or gets dropped.

In progress

2
  • In progressTelegram + Discord channels for Alerts

    Server-side webhook delivery to Telegram bots and Discord channels — same retry / idempotency / audit pipeline as the existing email + generic-webhook channels. Channel chips on /alerts already show `not connected` placeholders; needs env wiring + UI toggle in the rule builder.

  • In progressEmail-digest design polish

    Promote the alert-digest and Brief-digest emails from plain-text + minimal HTML to a branded table-based template (header / market cards / footer). Email-client compatibility (Outlook, Gmail, Apple Mail) is the constraint — modern CSS doesn't render.

Planned / Exploring

4
  • PlannedResend custom domain (notifications@orrery.me)

    Move outbound email off the shared `onboarding@resend.dev` sender to a verified custom domain. Currently blocked on GoDaddy SMS recovery to add the DNS records.

  • PlannedDeeper whale/wallet intelligence

    Wallet trade timeline already ships; next layer is per-market concentration, smart-money clustering across wallets, and a public wallet-leaderboard API tier. Most of the data is already in the persistent ledger; the work is presentation + sample-confidence guardrails.

  • ExploringAI-agent x402 catalog expansion

    Orrery already exposes 20 x402 endpoints for autonomous-agent consumption. Next: per-endpoint cost surfaces, payment-receipt audit log on /receipts, and developer-quickstart documentation for agent builders.

  • ExploringPublic data-quality SLA

    /status already publishes upstream uptime, per-component uptime, and a data-quality incident feed. The next step is a stated SLA — e.g. "99.5% of trading hours produce a valid live snapshot within 5 minutes of upstream" — and automatic incident write-through when the invariant trips.

Recently shipped

24

Most recent 24 changelog entries — newest first. Full history lives in lib/incident-log.ts CHANGELOG and on /status.

  • 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'.

Roadmap | Orrery