Futures Trading 6.1.4

2 August 2026

This release has upgrade notes. Read them before updating — they describe behaviour changes that need your attention.

ADMINRISKDASHBOARDLIQUIDATIONEXPOSUREOPEN INTERESTLEVERAGEVOLUMEFEESREPORTINGBUG-FIXESUI

Futures v6.1.4

Release Date: August 2, 2026 Tags: ADMIN, RISK, DASHBOARD, LIQUIDATION, EXPOSURE, OPEN INTEREST, LEVERAGE, VOLUME, FEES, REPORTING, BUG-FIXES, UI

Overview

The futures admin dashboard reported numbers that did not mean what they said.

v6.1.0 restyled that page and gave it a working error state. This release replaces what it measures. Every headline figure on it was capped, stale, mislabelled or ranked by nothing at all: Total P&L counted positions that had stopped moving, Total Volume dropped every liquidated position to zero, Total Positions was capped at 1,000 without saying so, the "top" markets were the first five ever created, and the time-range picker changed the chart and nothing else. Separately, every leverage figure in the admin read 0.00x.

In place of the vanity counters, the page now answers the question a futures desk actually opens it for. This platform is the counterparty to every position on its own book, so: how much exposure is open, which way does it lean, which positions are about to liquidate, and is any one market or leverage band carrying the risk.

Nothing on the trading side changes. This release touches the admin dashboard and two admin list screens; no trader-facing screen, no engine path and no money movement is affected.

Requires Core v6.6.1 and the Ecosystem extension.

Every headline figure on the dashboard changes, four of them because the old value was wrong — read Upgrade Notes before comparing anything against last week.

Update Instructions

pnpm updator

No migration and no seeder is required.

Every figure on the futures dashboard changes on its own, and several change because the old value was wrong rather than because it is presented differently. Those are in Upgrade Notes.


Upgrade Notes

Leverage now reads correctly in admin — your old screenshots and exports were wrong

Position and order records store leverage as a plain whole number, but the two admin list endpoints ran it through the conversion they apply to prices and amounts, which divides by 10^18.

  • Changed: a 20x position reads 20x. It previously read 0.00x, because the value being formatted was 0.00000000000000002.
  • Where: Admin → Futures → Positions, the position detail panel, and the futures orders table.

The dashboard's figures change, and the old ones are not a series to compare against

  • Changed: Total P&L now covers open positions only. Total Volume is replaced by the value of trades that actually matched in the selected period, with the fees earned on them. Total Positions becomes Open Positions, and is a real count rather than a capped one.

A very large book reports a partial scan rather than a wrong total

Position records are stored per trader, so there is no time-ranged read of them and a dashboard has to scan.

  • Changed: the scan is paged through to a declared limit and says when it stopped earlyFigures are a partial scan, naming the rows read and the ceiling. The counts below it are a floor, and are labelled as one.

The dashboard now says when it could not read the book at all

A failure reading the position store used to be caught, written to the server log, and answered with zeros — so an outage and an installation where nobody had traded yet looked identical on screen.

  • Changed: the page shows Position store unavailable with the reason, a Try Again, and a link to Markets. Market records come from the main database, so the market counts it can still read stay on screen and market configuration remains editable.

The futures order table is no longer linked from this page

  • Changed: the removed Quick Actions panel carried the only link on the futures dashboard to Finance → Orders → Futures. That table lives in the main admin menu, not in the futures navigation, so it is now two clicks away instead of one.

Added

A console masthead, with the book's margin health in it

The page now opens on a full-width band carrying three things, in this order: where the figures came from, the title and its controls, and a margin health meter.

  • Added a provenance rail — a live indicator, the time the figures were taken, how many position records were read, and the currency the book is denominated in. Three of those four used to be an 11-point grey line at the very bottom of the page, after everything they qualified.
  • Added the margin health meter: every open position's notional, split by how much of its posted margin it has already lost — Comfortable, Watch, At risk — with the share and the position count on each. The boundary between Watch and At risk is the engine's own trim point, not a number chosen for the display.

Open interest, posted margin and book skew

  • Added Open Interest — the notional value of every open position, with the margin actually posted against it underneath. This is the platform's exposure as counterparty, and the page had never shown it.
  • Added Book Skew — long and short notional, the split between them, net exposure, and the average and highest leverage on the book. Average leverage is weighted by notional, so one large position at 3x is not cancelled out by twenty small ones at 100x.

Closest to liquidation

The eight open positions with the largest share of their posted margin already lost, ranked. Each row carries the trader's name, the market, direction and leverage, a bar showing how far along it is, its entry, current and liquidation prices, and its running loss. Anything past 90% is flagged Critical.

  • Added the trader's name and email on each row, resolved in one lookup, so there is somebody to contact rather than an identifier.

Exposure by market

  • Added one row per market carrying open positions, ranked by size of book: open positions, distinct traders, the long/short split, notional, average leverage and unrealised P&L, with a count of at-risk positions. A market that has been disabled while still holding exposure is marked. Rows link to the market.

Leverage concentration

  • Added open notional grouped into five leverage bands — 1-5x, 6-10x, 11-20x, 21-50x, 50x+ — so it is visible at a glance whether the book's size sits in the survivable bands or the thin ones.

Traded volume and fee revenue

  • Added the value of trades that matched in the selected period, and the fees the platform kept on them.

Position lifecycle over the period

  • Added positions opened, closed and liquidated per hour or per day across the selected range, on one chart, plus period counters — including the share of the period's exits that were forced rather than chosen.

An at-risk banner

  • Added a notice at the top of the page when any position is past the engine's trim point, naming how many and how much notional they carry.

Changed

The dashboard is a console, not a landing page

  • Changed the full-width hero — a gradient title painted from two disagreeing status colours, two blurred colour orbs and six permanently animating particles — for the instrument band described above. It is a plane, a title and two hairlines; the depth comes from a border rather than a shadow, so it reads the same under any palette an operator sets and in both light and dark.
  • Changed where the page states its provenance. "Last updated" and the row count moved from the bottom of the page into the masthead's top rail, ahead of the figures they qualify.
  • Removed the Quick Actions panel. Its five tiles were Markets and Positions (both in the navigation directly above it), New Market (a second copy of a button already in the page header), Refresh (a control dressed as a destination, on a page that already refreshed itself), and Orders.
  • Removed the Recent Positions table — ten positions, newest first, which duplicated the top of the Positions table and answered no question. Its place is taken by the eight positions that need a decision.
  • Removed the Position Status Overview card. Its four lifetime progress bars were drawn from the capped sample and ignored the time range; lifecycle is now the activity chart and the period counters, both scoped to the selected window.

Amber is a warning again

  • Changed the page's own chrome — six icon tiles, both "View all" links and the hero title — off the warning colour, which it had been spending on decoration. That colour now appears only where something is wrong: the margin bar on an at-risk position, the Critical badge, the liquidation price, the at-risk market chip and the three notices. The at-risk summary tile is neutral while the count is zero.

Long and short are never told apart by colour alone

  • Changed every direction indicator to carry a word and an arrow alongside its colour. The platform's up and down colours are not reliably distinguishable to a red-green colour-blind reader, and this is a screen about which way the book is leaning.

Empty states name which kind of empty they are

  • Changed the exposure panel's empty state. The old Markets card offered Create Your First Market whenever nothing was enabled — advice that does not help an operator whose twenty markets are simply switched off, and which pointed at the create form rather than the list where they can be re-enabled. It now distinguishes markets are live but nobody is holding a position from no market is enabled for trading yet, and only the second offers a button.

It stops refreshing when nobody is looking

  • Changed the 30-second refresh to skip while the tab is in the background.
  • Added a 15-second server-side hold on the result, so several operators with the page open share one scan rather than each triggering their own. It deliberately does not cover a single tab's own polling, which is meant to recompute.

Charts, tables and cards come from the platform's own components

  • Changed the activity chart, which was built from absolutely-positioned coloured blocks with a hand-made tooltip, for a real chart with axes, a legend and readable values.
  • Changed the tables, cards and placeholder states to the platform's shared ones, so this page matches the rest of admin rather than resembling it.
  • Changed the entrance animation to one, on the summary figures. The page previously animated in nine separate blocks with a per-column delay on the chart.

The API no longer ships colours with the data

  • Changed the dashboard response, which carried hex colour values for the chart series. Nothing painted them — the page drew its bars from its own colour tokens and dropped the rest — so no screen changes. What changes is that the trap is closed: a response advertising colour fields is an invitation to move the platform's chart palette into a backend file where no theme setting and no lint would reach it.

Fixed

Total P&L counted positions that had stopped moving

Unrealised P&L is maintained while a position is open and left where it stood when it closed. The dashboard summed it across every position it read, whatever the status, so the largest figure on the page was live values added to frozen ones.

  • Fixed it now covers open positions only, and says what it is: money owed to, or by, traders if every position closed at the current price.

Total volume was open exposure with liquidations missing

The figure summed each position's current size. A close leaves that size intact but a full liquidation resets it to zero, so the number was live open notional plus the frozen size of closed positions, with every liquidated position contributing nothing.

  • Fixed replaced by the value of trades that actually matched in the period, with the fees kept on them.

Total positions was capped at 1,000 without saying so

The page took one page of records from the store, sorted those in memory, kept 1,000 and counted them. Every count, every ratio and every chart column derived from that sample and was presented as a total — and because the sort ran on one page rather than on the table, it was not reliably the most recent positions either.

  • Fixed the scan is paged through to a declared, raisable bound, and reports when it stopped early.

The market panel was not ranked by anything

  • Fixed it took the first five enabled markets in creation order and titled them as though they led. Replaced by exposure per market, ordered by size of book.

The time range did not change the figures

  • Fixed the selected range was converted to a start and end date that were never used in a query. Only the chart's column count changed — and an unrecognised value produced the thirty-day chart. The range now applies to the counters, the chart, and the volume and fee figures alike.

Every money figure was in dollars, whatever the market was quoted in

  • Fixed the summary tiles and the position table printed a $ in front of every amount. Futures notional is denominated in the market's quote asset, so a book quoted in anything else was being reported in a currency it does not trade. Figures now carry the book's actual quote asset — and where two different quote assets are open at once, totals are shown without a currency, because adding them and printing a symbol on the result would be wrong.

The whole dashboard blanked every 30 seconds

  • Fixed the automatic refresh put the page back into its loading state, so every 30 seconds the tiles dropped to dashes and the panels to grey blocks before the same numbers returned. The refresh is now silent: the figures stay on screen and only update.
  • Fixed the Long/Short card collapsed to a single short block while loading and then resolved into one roughly twice the height, shoving its grid row and everything below it down the page — every time it refreshed. Panels now hold their height.

A failed refresh gave no sign it had failed

  • Fixed the error state was reachable only when there was no data at all, so once the page had loaded, a failing refresh set the error internally and showed nothing for it. The figures simply stopped changing. A failed refresh now says so, above figures that stay put.

A failed read reported an empty desk

  • Fixed an error reading positions was logged to the server console and answered with zeros: no markets, no positions, no volume, no P&L — on the one screen an operator opens to find out whether anything is wrong.

The error screen took the page's own controls away

  • Fixed a failed load replaced the page with a bare centred block. The header, the range picker and the retry now stay, and a link to Markets is offered because market configuration still works.