AI Market Maker 6.1.6

2 August 2026

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

DASHBOARDADMINQUOTINGTRADE-GATESVOLUMECURRENCYEMERGENCY-STOPAUDIT-TRAILOBSERVABILITYBUG-FIXES

AI Market Maker v6.1.6

Release Date: August 2, 2026 Tags: DASHBOARD, ADMIN, QUOTING, TRADE-GATES, VOLUME, CURRENCY, EMERGENCY-STOP, AUDIT-TRAIL, OBSERVABILITY, BUG-FIXES

Overview

The admin dashboard, rebuilt around the one question it could not previously answer: is this market actually making a market right now?

The status column is not that answer. The engine refuses to trade a market with fewer than two active bots, with real liquidity switched on and nothing in its pool, or that has already spent its daily volume budget. A market failing any of those still carried the status ACTIVE and a green badge, so a silent market and a working one looked identical.

Three headline figures on this screen change, two of them because the old value was misstated, and one behaviour changes under you — read Upgrade Notes before comparing anything against what you wrote down last week.

Update Instructions

pnpm updator

Routine. No database change, no new setting and nothing to configure — every figure added here is derived from rows the engine already writes.

The dashboard is the screen that changes. The market registry, the analytics screen and the settings screen are unchanged, which is why the analytics screen's own volume tile will now disagree with the dashboard's — that is covered in Upgrade Notes.

One thing does change under you: an emergency stop from the dashboard now requires a written reason before it will run.


Upgrade Notes

The money totals were printed in dollars whatever your pools are quoted in

The TVL and volume tiles put a $ in front of a sum taken over each pool's own quote asset. A platform whose markets are all quoted in USDT read as dollars. A platform running one BTC-quoted market beside a USDT-quoted one had the two added together and a dollar sign put on the result.

  • Changed: the unit is the quote asset every market shares, and it disappears entirely the moment two markets disagree on one — that sum has no unit, and printing one is a fabrication with two decimal places on it. Where your markets do share a quote, the ticker is named once beside the figure and once per column, rather than repeated on every row.
  • Also: every total was divided by a thousand and suffixed K, unconditionally, so anything under 50 read as $0.0K and a pool of 250 read as $0.3K. Figures are now scaled to their own size.

"24h volume" was never 24 hours, and it counted active markets only

The figure summed a per-market counter that is zeroed at the daily UTC reset. It is volume today, not volume over a rolling day, so a reading taken just after the reset legitimately looks empty — which reads as a dead desk when it is nothing of the kind. It also summed ACTIVE markets only, so pausing a market part-way through the day silently removed the volume it had already traded from the total.

  • Changed: the dashboard labels it Volume today, sums it across every market whatever its status, and shows it against the total of the markets' daily volume budgets as a percentage — because that budget is a hard trade gate, and a market at 100% of it has stopped quoting until the reset.

A market showing ACTIVE is no longer reported as trading

Status and quoting were treated as the same fact. They are not. A market with one active bot, an empty pool under real liquidity, or a spent daily budget is refused by the engine on every tick, keeps its ACTIVE status, and rendered the same green badge as a market printing every few seconds.

  • Changed: the dashboard reports the engine's gate. The masthead meter and each market row say Quoting or Not quoting, and a market that is not quoting names the gate that is closed — too few bots, unfunded pool, daily budget spent. Your active-market count will not change; the count of markets actually making a market may be considerably lower.

An emergency stop now takes a reason, and your existing history rows do not have one

The button raised a browser dialog asking "Are you sure you want to stop ALL AI trading operations?" and then posted an empty request. The endpoint has always accepted a reason and has always written it onto an emergency-stop entry in every market's history, so every such entry already in your history reads "Emergency stop triggered by admin" — regardless of what actually happened, who decided it, or why.

  • Changed: the confirmation asks for a reason and will not run without one, and it names what it is about to halt — the markets that are ACTIVE plus those that are PAUSED, which is what the endpoint actually stops, along with the bot count. The result is reported as a toast naming how many markets and bots were stopped, rather than a browser alert only on failure.

Added

The dashboard says which markets are actually making a market

  • Added a quoting meter across the top of the page, dividing your ACTIVE markets into five states: in range, at the range edge, no price yet, outside range, and not quoting. The five counts add up to the active count, so nothing is hidden between them.
  • Added a Not quoting badge per market row, with the closed gate named beneath it, so the row states the remedy rather than the symptom.
  • Added an alert counting silent markets and breaking them down by cause — how many need active bots, how many have an unfunded pool, how many have spent their daily budget.
  • Added a last-print time on every market that is not blocked, stated with its date and not judged. Bot cadence is configurable per market, so "stale" is not a verdict this screen is entitled to make.

Where each market's price sits inside the range you configured

  • Added a per-market price marker showing the last known price against the configured floor and ceiling, with the two edge zones drawn, and a word — in range, at range edge, outside range — so the state never depends on colour alone.

How far each pool has been pushed to one side of the book

  • Added an inventory reading per market: what share of the pool is now held in the base asset, against the share it was funded with, and the difference in percentage points with its direction. A positive figure means the pool holds more of the base asset than it was funded to hold — it has been absorbing sells and is long the asset it makes a market in.

Volume against the budget that silences it

  • Added volume today against the daily budget, in total and per market, as a figure and a percentage. The budget is a hard gate, so a market approaching 100% is a market about to go quiet until the daily reset — visible in advance, instead of discovered as a flat chart.

The markets you need to look at are at the top

  • Added a ranking: markets that are not quoting first, then outside their range, then at the edge, then those with no price yet, then healthy ones, then paused and stopped — with the largest pool first inside each rank.
  • Added a stated cap. The table draws ten rows and says how many markets exist behind them. The old grid drew six cards in whatever order the database happened to return, and said nothing about the rest.

An alert when the engine is driving fewer markets than are marked active

  • Added a comparison between the number of markets the running engine holds and the number the database says are ACTIVE. The engine loads exactly the active rows, so a shortfall means markets failed to initialise — previously invisible unless you noticed one had stopped printing.

Changed

A dead card was removed rather than wired up

  • Removed the System Alerts card. It read a field the overview endpoint has never returned, in any version, so it could not render — an empty promise of a warning system on a page whose whole job is to warn you.

The dashboard is a console now, not a landing page

  • Changed the page from a decorated hero over four counters into an instrument band: what the feed is doing, when it was last read, which engine process produced the numbers, and the quoting state of every active market — above a table of the markets themselves.
  • Removed the five-tile Quick Actions panel. Its entries were New Market, All Markets, Analytics, Settings and Guide — the addon's entire navigation, repeated as buttons directly beneath the navigation that already lists them.
  • Changed every counter on the page into a link to the rows behind it. A count with no destination is a poster: you could read "3 markets short of bots" and then had to go and find them yourself. The active-bots counter now leads to the specific market whose bots are the problem.

The page stops polling when you are not looking at it

  • Changed the 30-second refresh to skip while the browser tab is hidden. Every operator leaves this page open in a background tab, and each poll reads every market, every pool and every bot row — previously for as long as the browser lived.
  • Changed the overview endpoint to index the bots once per request instead of scanning the whole bot table again for every market.

The licence check no longer blanks the whole admin area

  • Changed the licence gate so it covers the page content only. The header, navigation and footer sat inside it, so while the licence check was in flight the entire screen was replaced by a single centred spinner. Only the content waits now.

Fixed

The money totals carried a currency they were never in

  • Fixed TVL and volume being printed with a dollar sign regardless of the quote asset behind them, and every total being forced into thousands so that anything under 50 read as $0.0K. Where markets disagree on a quote asset the sum now carries no unit at all, because it has none. See Upgrade Notes.

The volume figure was mislabelled and covered only some of your markets

  • Fixed a counter zeroed at the daily UTC reset being presented as 24h Volume, so a reading taken shortly after the reset looked like a stopped desk, and being summed over ACTIVE markets only, so pausing a market erased the volume it had already traded that day. See Upgrade Notes.

Every emergency stop in your history records the same sentence

  • Fixed the emergency stop posting no reason to an endpoint that has always accepted one and has always written it into each market's history. The rows it produced all read "Emergency stop triggered by admin", so the history records that markets were halted and nothing about why. See Upgrade Notes.

A green badge was shown for markets the engine was refusing to trade

  • Fixed the dashboard reporting the status column as though it were the engine's verdict. Fewer than two active bots, an unfunded pool under real liquidity, or a spent daily budget each stop a market trading while it continues to read ACTIVE. See Upgrade Notes.

The market list blanked to placeholders every thirty seconds

  • Fixed the background refresh putting the whole page back into its loading state. Every poll replaced the list of markets with grey placeholder cards and rebuilt it, whether or not anything had changed — on a screen an operator watches. A background refresh now leaves the table on screen and only marks the feed as updating.

A failed refresh was silent

  • Fixed a failed poll leaving the figures on screen with nothing to say they had stopped advancing. The page kept the last good numbers — which is right, one bad request must not wipe a working dashboard — but said nothing, so a screen that had quietly gone stale was indistinguishable from a live one. It now says the refresh failed, gives the server's own reason, and shows the time the figures on screen were actually read.