Binary Trading AI Engine 6.0.2

5 August 2026

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

BINARY OPTIONSSTEERINGSETTLEMENTRISK LIMITSWIN RATEDRIFTMARKET MAKERPRICE PUBLISHINGVALIDATIONSETTINGSSNAPSHOTSCOOLDOWNSMACHINE LEARNINGAUDIT TRAILADMINDASHBOARDPERMISSIONSTRANSLATIONSBUG-FIXES

Binary AI Engine v6.0.2

Release Date: August 5, 2026 Tags: BINARY OPTIONS, STEERING, SETTLEMENT, RISK LIMITS, WIN RATE, DRIFT, MARKET MAKER, PRICE PUBLISHING, VALIDATION, SETTINGS, SNAPSHOTS, COOLDOWNS, MACHINE LEARNING, AUDIT TRAIL, ADMIN, DASHBOARD, PERMISSIONS, TRANSLATIONS, BUG-FIXES

Overview

The release that makes the engine's core promise real, and then makes it visible. Before this it could not steer an AI-Market-Maker market at all — it read one price series while settlement used another — its configured risk limits were read by nothing at runtime, and on MariaDB every decision it made was unreadable by the time settlement asked for it, so every outcome settled fairly while every log line and dashboard figure agreed with an engine that was working perfectly.

All of that is fixed. Alongside it the admin area was rebuilt: the console, the engine record page and the settlement ledger now answer one question in the same words — is this engine steering, and if not, why not.

Three things move money and one changes what a figure means. The two exposure limits are now enforced at runtime, clearing a numeric field no longer writes a zero over your setting, and today's platform profit no longer carries an invented dollar sign. Read Upgrade Notes before comparing anything against yesterday, and grant the fourteen new screen permissions after updating.

Requires Core v6.6.2 or higher, the Ecosystem extension, and the AI Market Maker extension for steering.

Update Instructions

pnpm updator

A configuration step is required. Binary markets now declare which price feed backs them. Markets imported from the Ecosystem list before this release are still marked exchange-backed, and the engine cannot steer them. From backend:

npm run verify:binary        # report what needs attention
npm run verify:binary:fix    # repair the unambiguous cases

Then grant the new screen permissions in Admin → Roles. Fourteen screens now enforce their own key and six of those keys changed spelling, so a role that held the old key holds nothing. Test as a normal admin role — Super Admin bypasses permission checks and cannot show you this.


Upgrade Notes

Your configured risk limits are now enforced — check the values you have set

Max Daily Loss and Max Single Order Exposure appeared on the engine form and were reported on the dashboard, and nothing read either of them at runtime. Measured before the fix: an engine configured to cap one order at 1,000 accepted 1,600 orders of 5,000, and an engine with a 500 daily loss budget took −143,000 in a single expiry.

Because a forced win lands on whichever side holds the most orders, a single oversized ticket could pay out an arbitrary multiple of the configured daily cap.

  • Changed an order above the exposure cap is refused at placement with the limit named — "Amount exceeds the maximum single-order exposure of 5000 USDT for this market". Live orders only; practice orders are unaffected, and there is no cap on a market no active engine manages.
  • Changed a forced outcome that would push the period past Max Daily Loss now reverts to the profit-optimal side. The win rate drifts; the balance sheet does not.
  • Review both figures on every engine before you update. They have never had any effect, so a value typed once and forgotten is about to start refusing orders.

These two settings genuinely compete. Holding an order-count win rate against a book with very unequal stakes is loss-making as arithmetic, not as a defect — set the loss budget low and the win rate will drift, set it high and you are funding the target.

Clearing a numeric field no longer writes a zero over your setting

Every numeric box in this addon read an empty field as the number 0, and 0 is a meaningful value for most of them. Selecting a value and pressing Delete wrote that zero on save, with a green success message.

  • Fixed the engine create wizard, where a cleared Max Price Adjustment produced a brand-new engine reporting ACTIVE that never steered a single settlement — 0 is the documented "steering off" value — and a cleared Max Daily Loss produced an engine with no loss budget at all.
  • Fixed the global Minimum, Maximum and Default Target Win Rate boxes, where a cleared field persisted a 0% floor below the field's own stated minimum, and every new engine and every automatic adjustment was then clamped against it.
  • Fixed the user-tier form, where a cleared Minimum Volume wrote a threshold of 0 — a tier that then matches every user on the platform and competes with the entry tier for all of them.
  • Check these three areas after updating if anyone has edited them recently.

Steering is narrower than before, deliberately

The engine now steers only markets whose price the platform publishes, and only when settlement runs on time. On an exchange-backed market it records its decisions and settles fairly.

  • An engine bound to a market still marked exchange-backed will do nothing until you run npm run verify:binary:fix or set the market's source in Admin → Binary Markets.

Today's platform profit no longer carries a dollar sign — and on a mixed fleet it carries no unit at all

The headline Platform Profit figure was printed as $1,234.56. There is no currency anywhere on the record it is summed from: the unit is each market's quote asset, so on a USDT market that dollar sign was invented, and on a platform running markets quoted in two different assets it was stamped on a sum of unlike things.

  • Changed the unit is derived from your engines' own markets and printed only when every engine agrees on one. A fleet running BTC/USDT and ETH/BTC together gets the number with no unit, because there is no single honest one to give.

"Off target" is now judged against each engine's own band, not a fixed 5%

The engine cards tinted a win rate the moment it sat more than 5 percentage points from target. That 5% is nothing more than the default value of Win Rate Variance — the tolerance each engine actually steers to, and one you can set per engine.

  • Changed every screen now reads each engine's own variance band. Every engine you have tuned away from the default was being judged against the wrong threshold — one set to a tight ±2% band never showed as off target until it was two and a half times outside it, and one set to ±10% was flagged while still inside its own tolerance.
  • Changed a drift verdict is now withheld until an engine has settled twenty trades in the period. An engine one trade in used to display a confident 100%.

Fourteen screens now require their own permission — grant them after updating

Every Binary AI Engine screen previously fell through to generic admin access; none appeared in the route permission list. They do now, and the keys match what the API behind each screen has always enforced.

  • Changed fourteen routes across the dashboard, engines, analytics, correlation, cooldowns, tiers, snapshots and settings now require one of thirteen keys.
  • Grant them per role in Admin → Roles. Six areas changed key spelling from access.… to view.…Analytics, Cooldowns, Correlation, Engines, Snapshots and User Tiers — so a role that already held the old key holds nothing. Four now-dead keys are removed.
  • Test as a normal admin role, not as Super Admin.

Added

The engine record page tells you whether the engine is steering, and what to do when it is not

The page an operator opens to judge one engine used to be a configuration form with a heading. It fetched five computed blocks from the server and rendered one field of one of them.

  • Added a steering verdict at the top of the page, in the same words the console uses to rank engines. An engine can sit at ACTIVE, green, and be publishing nothing but fair closes; the page now says so and lists every reason.
  • Added a remedy button on each reason — start the engine, open its market maker, leave simulation mode, set an adjustment band, open the binary market, open global settings.
  • Added two instruments in the page header, visible from every tab: where the realised win rate sits inside the engine's own variance band, and how much of the daily loss budget is left. Both are limits the engine acts on at settlement, not decoration.
  • Added the period clock the win and loss counters are measured over. A 12/3 record forty minutes into a 24-hour period and the same record at hour 23 mean opposite things and rendered identically.
  • Added the practice period block, so an operator tuning practice targets can see whether they are being hit. Those counters were on the wire and invisible.
  • Added the risk assessment — level, score and all five weighted factors with their values and thresholds. An engine the risk engine had already concluded should be emergency-stopped previously rendered as a green ACTIVE badge with no warning of any kind.
  • Added an alert when the risk engine recommends a pause or an emergency stop, carrying the control that performs it.
  • Added Start, Pause, Resume and Stop to the page. This screen could diagnose an engine and offered nothing to act on it — the only place in the product that could change an engine's status was the console.
  • Added a settlement decision breakdown for the last 24 hours. An engine with no blockers and no steered settlements is the most expensive state in this addon, and nothing on any per-engine screen could show it.
  • Added the engine's audit trail to the page. Every configuration change, status change and risk alert has always been recorded, and no screen read it — while this page's own Save was one of its biggest writers.
  • Added controls for four settings that could not be changed anywhere after an engine was created: Whale win rate cap (the number the "reduce exposure" strategy actually reduces to), Whale profit multiplier, Whale alerts and Emergency stop loss.

The dashboard is translatable

  • Added 69 translation entries covering every word the dashboard renders — headings, tile labels, verdicts, dialogs, confirmations, toasts and empty states. The screen previously carried none: only its navigation entries were translated, and the page itself was English typed into the markup.
  • Added a further 165 entries for the engine record page, the settlement ledger and the correlation console.
  • Added all of them to all 90 language files. Shared vocabulary the rest of the admin already translates reads in the operator's language immediately; the engine-specific lines are seeded in English for the next translation pass.
  • Fixed the addon's navigation being absent from the translation build entirely, so every menu label fell back to English in all 90 languages regardless of what had been translated.

Engine drift, as the thing the console is about

  • Added a drift band across the top of the console: how the running fleet splits into above target, below target, on target and too few trades, with the trouble at the left edge and a count on every segment.
  • Added an Engines off target tile beside win rate, settled trades and platform profit — one KPI row of four, each linking to the rows behind it.
  • Added direction that does not depend on colour. Above-target and below-target are opposite problems — the desk bleeding versus traders being squeezed — so every drift figure carries an arrow, a sign and a word as well as a tone.
  • Added a win-rate axis on each engine card, with the target as a tick mark on the track. The old card drew a bar filling toward 100%, which is not a target anybody set.
  • Added trouble-first ordering to the six-engine preview, ties broken by the size of the miss.

The kill switch reports its own state

  • Added a line saying how many running engines Emergency Stop would actually halt — or that there is nothing running to stop.
  • Added a banner when the kill switch has been pulled in the last 24 hours: when it fired, the reason given and who triggered it.
  • Added a dedicated server lookup for that question, so it survives a busy day. The event feed it would otherwise be read from is capped at twenty and ordered newest first, so twenty whale or correlation events landing after a stop would have hidden it completely.

The daily-loss budget now outranks the target win rate

Hitting a target win rate could cost the house far more than the operator ever agreed to lose, because the side that satisfies the win rate is frequently the side carrying the largest aggregate payout. Under a copy-trading herd the payout on that side was measured at 286 times the configured daily cap.

  • Added a budget check before a win-rate decision is honoured: if taking the win-rate side would push the period past Max Daily Loss while the profit-optimal side would not, the engine takes the profit-optimal side.
  • Added the override to the audit trail, so "why did the win rate drift this period?" has an answer on the record rather than a theory.
  • Added a fail-safe: when the period's profit cannot be read, the budget is treated as already spent.

The optimiser refuses to move a live target with a model that does not fit

The machine-learning auto-apply could move an engine's live target win rate on volume alone. Its only gate was confidence, which counts recent positions and says nothing about whether the model fits them — so a busy hour was enough to unlock it.

  • Added a minimum measured accuracy of 0.5. Below it the optimiser does nothing and reports "model accuracy 0.31 < 0.5" rather than adjusting the target.
  • Added accuracy and error recording on every training run, so the gate has a figure to read and the operator has one to look at.

External price correlation is configured on its own screen

The controls for external price correlation sat on the engine form, where enabling monitoring wrote the platform's active exchange name into a field that accepts only three specific providers. On any install not running Binance the save was refused, and because the field was only written on the enabled branch, switching the control back off did not clear it — the whole form stayed unsaveable until a reload.

  • Added a monitoring configuration panel to the correlation console: the provider, the deviation threshold that raises an alert, and the switch. It writes both the engine's own columns and the provider list the monitor actually reads, which is why it belongs there and not on the engine form.
  • Added engine selection from the address bar, so a link from an engine opens that engine's correlation state rather than whichever engine happens to be newest.

Provenance on the figures

  • Added a line stating what the numbers cover: live positions only, demo excluded, and day totals measured since server midnight. Both were already true and neither was stated.
  • Added a live/updating/stale indicator that goes amber when a refresh fails, so a green pulse can never sit above a notice saying the figures could not be read.
  • Added the quote asset to that line whenever one can be derived.

Changed

Destructive actions now ask first, and name what they will do

Three controls changed live configuration from a single unconfirmed click.

  • Changed Roll back to snapshot to open a confirmation naming the engine and the snapshot. It restores thirty-eight configuration columns and reloads the running engine immediately — including simulation mode, the settlement steering band, the daily loss limit and unattended ML retargeting — and it fired straight from a row menu.
  • Changed Train Model to ask first on any engine with ML auto-apply switched on. On those engines, fitting the model also writes the recommendation onto the live target win rate and reloads the engine, so the next settlement is decided against a target nobody typed. The button was labelled as though it only trained.
  • Changed the emergency-stop confirmation to name the number of engines it will halt, and to say so plainly when it cannot — on a failed load it names no count rather than promising to stop zero engines. Confirm stays disabled until a reason is typed, which also removes the double-click that could fire the stop twice.

Fleet-wide actions report what actually happened

The six Emergency Actions each returned a count, and several return the engines they could not act on. All of it was discarded in favour of a fixed success message.

  • Changed each action to report the server's own outcome. Resume All Engines now names how many could not be resumed — an operator restoring a twelve-engine fleet after an incident, nine of which failed, was told all twelve were back.
  • Changed the reason box to appear for every action whose backend records one. Only the emergency stop offered anywhere to type a reason, so every fleet-wide pause, resume and cooldown clear in the audit trail carried the same canned default forever.

Saving an engine now writes only what you changed

The engine form posted all thirty-six configuration columns on every save, seeded once when the page loaded and never compared against anything since.

  • Changed the save to send only the fields that actually differ. The machine-learning optimiser and the A/B test winner both write the target win rate from outside this screen, so editing a loss limit an hour after opening the page reverted their work to whatever had been on screen at load — and the audit trail recorded the revert as a deliberate change by that admin.
  • Added a conflict check: a save that would overwrite a change made since the page loaded is refused with an explanation rather than applied silently.
  • Changed the form to surface the server's own refusal. The API names the exact field and bound that failed — "Max price adjustment percent must be between 0 and 0.01" — and the page replaced all of it with "Failed to update engine", stacked on top of a second contradictory message.

The settlement ledger explains every verdict, not just the healthy ones

The engine records a reason for every settlement. The ledger explained thirteen of them and went silent for eleven — and those eleven were, without exception, the faults.

  • Changed the ledger to carry a plain-English explanation for every reason the engine can write, including publish failed, steering threw, market maker stopped, bad expiry and price not positive. These appear nowhere else in the product; a row showing one used to display a bare code with an empty tooltip and no explanation at all.
  • Changed the colour split from two ways to three, so a genuine fault is marked apart from a deliberate refusal and from late settlement. The console flags a rising late-settlement rate in amber and links here for the evidence, and the evidence was grey.
  • Changed the lateness figure to the engine's own measurement. It was computed as elapsed seconds while the engine measures whole minute buckets, so a verdict reading "1 minute after expiry" sat directly above a sentence saying settlement ran at or before the expiry instant.
  • Added the market, the pair and the quote asset to the page. It named none of them, so every stake and profit figure on it was denominated in nothing — on one engine 0.05 is a real stake, on another the same digits are a different order of magnitude.

The console, the engine list and the record page now give the same verdict

  • Changed the drift verdict to be decided once, on the server, and read by all three screens. The list computed its own with no minimum sample, so an engine one trade into a period displayed a confident 100% while the console beside it said "too few trades".
  • Changed the engine list's market column to stop offering a sort control. Sorting by symbol was silently reordering the rows by creation date.

The dashboard is a console, not a landing page

  • Changed the page onto the standard admin frame. The decorated banner with two coloured orbs and six floating particles is gone, along with the five-tile Quick Actions panel whose entries were the five links already in the navigation directly above it.
  • Changed three duplicated layouts into one. The KPI row, the engine grid and the action menu each shipped a desktop copy and a separate narrow-screen copy, which showed six engines on a desktop and four on a phone and put the entire navigation behind a second floating menu.
  • Changed the two per-engine feature markers from a warning-coloured shield and a coloured person into plain chips reading Whale detection and User tiers — two status colours were being spent on two feature flags.
  • Changed the section-by-section entrance animation, which replayed on a timer, to a single one.

The 30-second refresh stops redrawing the page

  • Changed the poll so only the first load draws placeholders. It previously flagged every refresh as a fresh load, so the engine grid collapsed into grey rectangles twice a minute on a screen operators leave open.
  • Changed polling to pause while the browser tab is hidden. A background tab was scanning the position table every thirty seconds for nobody.
  • Changed a failed refresh so it no longer replaces a dashboard that is already on screen — it adds a notice and keeps the last good figures.

Settings that now do something

Nine of the 24 fields on the Settings page did nothing anywhere in the addon. A field that appears and then changes nothing is worse than a missing field, because the operator believes the limit is in force.

  • Changed Tier 1–5 Bonus (five fields) to set the platform default for Bronze / Silver / Gold / Platinum / Diamond. The outcome calculation used a hardcoded table; a per-engine value still overrides them.
  • Changed Win Rate Adjustment Speed to limit how far the automatic optimiser may move an engine's target win rate in one step, replacing a hardcoded 2%.
  • Changed Practice Mode into a platform-wide shadow switch: every engine keeps analysing and recording what it would have done, and no real settlement is steered.
  • Changed Big Win Threshold and Whale Threshold into absolute amounts. They were labelled "multiplier over average stake" — a figure nothing in the addon ever calculated — and are stored separately so an existing multiplier is never reinterpreted as an amount.

Clearer errors instead of server errors

Several ordinary answers arrived as server errors, which the interface renders as a crash:

  • Training the machine-learning model without enough settled history now says how many samples it has.
  • Applying an A/B test winner when the test is still inconclusive — the most common answer of all — now says so.
  • A tier win-rate bonus above the allowed cap, or an inverted volume band that can never match any user, is now refused with the limit named. An inverted band was accepted outright before.
  • A cooldown win-rate reduction outside the valid range is now refused.
  • Requesting a machine-learning recommendation for an engine that does not exist now says "not found" instead of returning a recommendation derived from nothing.

Screens stop replacing themselves while they wait

  • Changed the engine detail, analytics, correlation and tier screens so a pending page keeps its own layout. Each previously swapped its entire body for a centred spinner and rebuilt it in one frame — on the engine editor that was roughly 1,600px of form controls whose geometry never depended on the response.
  • Changed the engine, tier and snapshot creation wizards so the market picker holds the shape of its own grid while the list loads. The Next button no longer jumps several hundred pixels when the list arrives.
  • Changed the Emergency Actions buttons to the platform's own busy state, which also announces itself to screen readers.
  • Changed the settings screen's pending state to render from the page's own configuration, so the tab count, labels, icons and field counts cannot go stale.

Smaller corrections

  • Changed every Binary AI Engine screen onto the platform theme. The addon's admin screens took their colours from a fixed rose-and-pink scheme with hardcoded green, amber, red and blue accents, so an operator running their own brand colours had one area of the admin that stayed someone else's product. All 25 screens now follow a custom brand palette and light and dark mode like everything else.
  • Changed counters to read properly — 12,480 rather than 12480 — with a fixed-width numeric face, so digits stop shifting sideways every time the dashboard refreshes.
  • Changed a start-up failure to leave a trace in the log. An engine that failed to start wrote only to the raw console while the scheduled job reported completion, so an engine failing on every pass looked exactly like a healthy one.
  • Changed the engine to stop asking the same question hundreds of times a second. For every open order, twice per second, it re-asked the same questions about the same users; fifty open positions meant roughly 200 database queries a second.
  • Changed the user-tier and cooldown registries so a row can be opened. Neither table carries an engine column, so the detail panel is the only place a row says which engine it belongs to — and it was built and unreachable.
  • Changed profit figures to account for the payout. The expected-profit calculation compared raw stakes and ignored the payout rate entirely. At a 35% win rate and the default 72% payout the real edge is 29.8% of turnover, not the 65% the documentation claimed; break-even sits at a 58.1% user win rate.

Fixed

The engine could not steer any outcome on MariaDB

The engine records its decision on the position. On MySQL that record reads back correctly; on MariaDB it read back as unreadable, so settlement concluded "no decision was recorded" and settled fairly. Nothing threw an error, and the unreadable value was then mangled during reconciliation, destroying the decision record along with it.

Measured on a live market before the fix: a marginal RISE win the engine had decided to flip settled as a WIN at the honest price. After: the same book settles as a LOSS at the published, in-band price.

  • Fixed four more features that failed the same way, each silently doing nothing on MariaDB: A/B test settings (applying a winner wiped the engine's live target win rate, disabling targeting on the very engine being tuned), cohorts (every cohort matched nobody), risk alert history (every entry showed "UNKNOWN / 0"), and machine-learning model weights (the "already trained recently" guard never engaged).
  • Fixed the allowed order types on an engine reading back as text rather than a list, which made unticking a type throw and ticking one send twelve single characters to the server — taking every other unsaved edit on the form with it.

The engine can now actually steer

The engine binds to an AI Market Maker, but binary orders on those markets were priced from the centralized exchange. The engine steered the market maker's price while real money settled on Binance's. Measured on a test market: the engine was steering a price of 100 while orders settled at 250.

  • Fixed the price analysis and the binary settlement path to read the same price series, so a steering decision can never be made against a price that does not settle.

The chart and the trade history now agree

The engine settled on a private price while the chart kept showing the real one, so a client could screenshot a contradiction: history 99.80, chart 100.10.

  • Fixed by writing the steered close into the market's own one-minute price series and pinning it as that minute's close before the order settles. One expiry produces one close — every order sharing an expiry settles on the same published number, recorded platform-wide, so a restart mid-minute or a second server cannot publish a different one.
  • Fixed the cases where publishing legitimately cannot happen — the market maker is stopped, the market is exchange-backed, or settlement ran after the expiry minute closed. Each settles at the honest close and records that condition as its reason. A price that cannot be shown to the user is never used against them.

The win-rate controller had no lever

Target User Win Rate counts orders, and the engine chose outcomes by comparing money. On any book those two resolve to the same answer profit optimisation had already reached — so "force a user loss" selected exactly the side the engine would have chosen anyway, and a win rate running above target had no mechanism to come back down. It shows worst when a crowd of small orders sits opposite a few large ones, which is precisely the book copy trading produces.

Measured against a 35% target under that book shape: 93% realised. Now 40%.

  • Fixed forced wins and losses to select by order count, which is the quantity being controlled. Profit optimisation still uses money, which is correct there.

Settlement is priced as of expiry

Settlement read the live price at the moment it ran. The in-process timer fires on time, but the backstop cron and the post-restart sweep can run minutes late, settling a real position on a price the contract never saw.

  • Fixed settlement to resolve the close of the candle covering the expiry.

The engine read the current price as zero on every pass

The engine looked its market up by a name that record does not carry, so the lookup failed every time and the current price came back as 0. It never surfaced as an error — the failure was caught and answered with a zero. Everything derived from that price was computed from nothing: how far the price had to move, the confidence attached to every steering decision, and the "before" price on every price-adjustment row in the audit trail.

  • Fixed the engine to read the same shared price the binary settlement path reads.

The settlement steering band was unbounded

Max Price Adjustment Percent is the only limit on how far a settlement may be moved from the honest close — and it accepted any value at all. A 50% price rewrite was accepted and applied.

  • Fixed with a hard ceiling of 1%, enforced both when you save and when the setting is loaded, so a value written by an older build or edited directly in the database cannot widen it either.

A legitimate zero was replaced by a default

Setting a numeric field to 0 was treated as "not set", so the default came back instead. An operator who set the steering band to 0 to switch steering off got the 0.3% default; the minimum position for optimisation (0 meaning "steer every bucket") became a 10-unit floor; and max daily loss (0 meaning "allow no loss") became a 10,000 budget. In each case the engine did the opposite of what the form said.

  • Fixed across the engine configuration, the risk limits and the win-rate band, so a configured zero is honoured everywhere it is read.

Price-adjustment records showed the price requested, not the price reached

The market maker silently clamps a steering request into its own configured price range, so the audit trail recorded a price the market was never actually steered toward.

  • Fixed each entry to carry both the price requested and the price achieved, and to name which limit clamped it — the engine's own steering band or the market maker's price range. The adjustment percentage is left blank when the previous price is unknown, instead of being filled in with a figure that means nothing.

A settlement now records why it did or did not steer

Every refusal to steer is deliberate — an exchange-backed market, a stopped market maker, practice mode, a settlement that ran after the expiry minute closed. From the outside they were indistinguishable from each other, and from a broken engine.

  • Fixed by recording the reason on each position: steered, or fair and the exact condition that stopped it.

The admin screens validated almost nothing

Thirty-seven fields were saved with barely any checking. Both create and update now validate every field and refuse — with a message naming the limit — values including:

Accepted beforeWhat it did
Win rate reset hours: 0Every period instantly overdue, so the controller reset before it could measure anything. Win-rate targeting silently stopped working.
Max daily loss: -5000The daily-loss guard could never be satisfied.
Max single order exposure: -1Nothing read the cap when an order was placed, so it did nothing — and now that it is enforced, a negative value would refuse every order.
Win rate variance: 5A band the real rate can never leave, so the controller never acts.
Whale win rate cap: 4A "cap" above 100%.
External price source: "MYCOUSIN"Correlation monitoring permanently unable to start, while reporting itself as enabled.
Allowed order types: a single value where a list was expected
  • Fixed engine creation to check the whole form before checking for a duplicate, so a bad form is reported as a bad form instead of being masked by "already exists".
  • Fixed the automatic pre-change snapshot being taken before validation, so a rejected save no longer leaves a rollback point behind for a change that never happened.

A paused engine could not be resumed

Resuming a paused engine failed with "Engine not loaded" — every time. Resuming was structurally impossible; the only way back was knowing that stopping and then re-activating worked instead.

  • Fixed pause, stop and resume to work from the recorded state. The same problem applied after a restart, or on any deployment where the scheduled jobs run elsewhere: an engine active in the database but not held in memory could be neither paused nor stopped, and since deletion requires a stopped engine, it could not be removed either.
  • Fixed stopping an engine recording a pause and then overwriting the status, which left no record of the stop anywhere in the audit trail and left the engine running in memory.
  • Fixed activation requiring a live in-memory market maker, which is impossible on a multi-process deployment. It now checks the market maker's recorded status.
  • Fixed starting an engine being filed in the audit trail as a configuration change. The status it checked for has never been a value the status column can hold, so no start has ever been recorded as one.

A snapshot did not capture what a rollback restores

A rollback restores whatever the snapshot captured — and eight settings the edit screen can change were never captured. So a rollback restored 21 of 29 settings, reported success, and left the rest wherever they had drifted to. The gaps were not incidental: whether the engine steers real money at all, which positions it steers and how early, and whether it rewrites its own target win rate unattended.

Worse, there were two different ways a snapshot could be created. The one the admin panel's "Create Snapshot" page uses captured only 11 fields — so every hand-made rollback point on the platform restored 11 settings out of 37, and every snapshot comparison read 0% profit because that path never recorded performance either.

  • Fixed both paths to capture everything a rollback can restore.
  • Fixed the create page reporting "Snapshot created successfully" and navigating away when the save had in fact failed, leaving the operator believing a rollback point existed when none did. A failed engine list on the same page rendered as "no engines", which reads as a fresh install.
  • Fixed opening a snapshot by its own link answering "Binary AI Engine not found".

Five buttons on the Settings page did nothing

The Emergency Actions panel offers six actions. One of them existed:

ActionBefore
Emergency Stopworked
Pause All Enginesnot found
Resume All Enginesnot found
Reset All Periodsnot found
Clear All Cooldownsnot found
Create All Snapshotsanswered "Binary AI Engine not found"
  • Fixed all five. Each opened a confirmation dialog and then failed. They now do what the panel's own description promises — including Reset All Periods, which archives each engine's closing counters to daily statistics before clearing them, and Create All Snapshots, which is meant to be the rollback point taken before a bulk change.

Cooldowns punished the wrong thing

A "big win" is a big win. The big-win threshold is documented as a profit threshold, and the check compared the stake. A 1,000 threshold fired on a 1,000 stake that returned 750 profit, and never fired on a 999 stake that returned 999 on a high-payout type. The cooldown then recorded the stake as its trigger, which made the cooldown history unreadable.

Practice trading earned a real penalty. The win-streak check counted every settled order the user had ever placed, demo included — so three wins on the practice account applied a real win-rate reduction to the user's real money.

Streaks leaked across markets. A cooldown belongs to one engine, which steers one market, but the streak counted wins on unrelated pairs — including pairs with no engine at all.

Enabling correlation monitoring did nothing

Turning monitoring on returned "configuration updated" and started nothing, forever — the three settings the monitor actually reads were never written. It also reported success for an engine that did not exist, and accepted price-source names the monitor cannot use.

  • Fixed the write to set the columns the monitor reads, refuse an unknown provider, and answer "not found" for an engine that does not exist.
  • Fixed the correlation page treating its engine list arriving as its correlation data arriving. The moment an engine was selected — before a single byte of correlation data had come back — the page displayed a green tick and "All Clear — no correlation alerts at this time".
  • Fixed the same panel reading a field that can legitimately be absent, which threw during rendering and blanked the tab.

Exposure figures ignored the payout being sold

On a book holding 500 on RISE against 10 on FALL at a 75% payout, the house result on a RISE settlement is −365; it was reported as −490. Because the "most profitable outcome" is derived from those figures, a position could be reported as favouring the side that in fact loses more.

Whale detections have never appeared in the recent events list

  • Fixed the 24-hour event query filtering on an event type that nothing has ever written. Whale detections are recorded under a different name, so in every version of this dashboard a whale detection was recorded, counted and acted on by the engine — and was invisible on the one screen built to show it.

Every event in the list read "No description"

  • Fixed the event rows reading a description and a severity off a record that has neither. Every row printed the literal fallback text, for as long as the panel has existed.
  • Fixed them to show what the record actually carries — the reason on an emergency stop, the deviation on a correlation break — and each row now links to the engine it belongs to.
  • Fixed the panel showing only the first five of the twenty events it had already loaded, with nothing on screen saying so.

Reading a page wrote to the audit trail

  • Fixed the risk assessment recording an alert row every time it ran at high or critical. It runs on every load of the engine record page, and that page refreshes on a timer — so a high-risk engine left open on a screen filled its own history with rows describing the act of looking at it, each one typed as a configuration change nobody made.

Two admin pages returned a server error

The positions and actions pages for an engine failed on every request. Both work now.

A failed dashboard load rendered as a dashboard full of zeros

When the dashboard request failed, the failure was handled by a path that could never run, and the screen fell through to its empty defaults — a complete, confident dashboard reporting no engines, no orders and no profit. There was nothing to distinguish a broken dashboard from a quiet platform.

Pausing one engine could not be done from a desktop browser

  • Fixed the per-engine pause and resume existing only inside the narrow-screen card. On any desktop width the dashboard could tell you exactly which engine had drifted and offer nothing to do about that engine — the only control on the page was Emergency Stop, which halts the entire fleet.

The current win rate could not report the alarming case

The engine record page substituted the target whenever the realised rate was zero, and on one of the two places it appeared, the substitute was the unsaved target slider.

  • Fixed both. An engine that took every stake in the period — genuinely 0% — read "35.0%, on target", which is exactly what a maximally-steered or misconfigured engine looks like. And dragging the target slider moved a figure labelled as a measurement.

A licence check blanked the entire Binary AI Engine area

  • Fixed the licence gate sitting around the whole page rather than around the content it licenses. While the check was in flight the header, the navigation, the content and the footer were all replaced by one centred spinner.
  • Fixed the area's pages not reserving full window height, which let the footer's position depend on how tall the data made the page.

The settings screen's loading state drew a page that does not exist

  • Fixed the pending state for Settings rendering a layout this route has never had: the wrong top spacing, no hero band, a "System Status Banner" that exists nowhere, and a four-tab strip on a screen with six tabs. It was a byte-for-byte copy of another addon's file.

Removed

  • Removed the narrow-screen floating action button and its alert badge. The badge was the length of the recent-events list, and the server caps that list at twenty — so it read "9+" for twenty events and for two thousand alike, and could never read anything else once past nine. The menu behind it was a second copy of the navigation.
  • Removed four permission keys that no screen enforces. See Upgrade Notes.