SOAP2Docs← Website
***RELEASE NOTES FOR SOAP2***
This page summarises what changed in each release of SOAP2: the current and upcoming release in detail, older builds grouped by theme.
For any feedback or issues, please contact the developers on the [Slack Community](https://soap2-licensing.soap2-reg.workers.dev/join-slack)
The SOAP section is dedicated to support and comments. Please use it for any SOAP related issues.
Feedback is always welcome. Always send the MessageLog.txt file with your feedback. It is located in the SOAP2 Data directory.
A CrashReport.txt file is also generated when SOAP untimely crashes. It is located in the same directory as the MessageLog.txt file.
## November 6th, 2026 — Version 1.1.6.0
The latest release. The AI assistant can now refresh, open and review your trades for you (even with SOAP2 closed), the Options Analysis trade box can be filtered by category, closed trades can be rebuilt from their fills, and the Outlook and Market Statistics tools were reworked in plain words. It also carries a round of fixes from a full code review, ten more guides as Help pages, and screenshots across the guides. Several items are new and lightly tested; please report anything that looks off on the [Slack Community](https://soap2-licensing.soap2-reg.workers.dev/join-slack).
- **Work in progress: the stored reports and the Outlook.** This week reworked how the reports explain themselves (plain wording in the summary view, a quality assessment at the top of the Outlook, data-source and history-length warnings, a "leaning" tier, a longer held-out test on long histories). They are better, but not yet where they should be: on SPX the Outlook still finds no tool that has earned the forecasting role, so expect "DESCRIPTION ONLY" or "THIN" grades for now. Reporting will keep improving over the coming weeks; treat the readings as descriptions of the market now, not forecasts, and tell us what stays vague or inconsistent.
- Fixed (new, lightly tested): **A fast sell-off no longer reads "business as usual".** On 5 November SPX fell 3.8% and the Dispersion, Sticky-Skew and statistics reads stayed calm. Three causes, three fixes. (1) Dispersion/Correlation had no place for correlation AND dispersion spiking together, so it scored 0% everywhere and said "Mixed, near the middle of its ranges"; there is now a fifth regime, **High Corr / High Disp (stress)**: COR1M at the 85th percentile or above with implied (DSPX) or realized dispersion at the 65th or above. A "Mixed" read also no longer claims everything is mid-range when an input is at an extreme. (2) Sticky-Skew kept calling a rolling SSR above 1 "range-bound" while ATM vol surged; when realized vol is in its top decile and ATM vol is up 2 points or more on the day, the headline now says vol is surging (stress) and the text explains the SSR is above 1 (the label itself is unchanged). (3) The AI market read now carries `underlying.gap_vs_last_close`: the move since the last close in daily sigmas, level 1, 2, 3 or 4+, with a warning that the DAILY results (statistics, daily dispersion, daily sticky history) lag the price. The same **PRICE ALERT** line now heads the SPX Distribution Stats report and the Dispersion and Sticky-Skew windows when the live SPX is 1 sigma or more from yesterday's close (not shown below 1 sigma, or without a quote in the watchlist). The Market Statistics / Feature Store reports now print the same **PRICE ALERT** under their first line (SPX in sigmas; NDX and RUT in percent when the move is 2% or more), and a **STALE DATA** line when their newest bar is two or more sessions old. A new **Recent move** line says what the last session did in units of a normal move on that frame (and how much more volatile the last bars were), and the drift, variance-ratio and volatility lines no longer read as calm through it. The Market Internals Regime line never quotes a stored daily read that is two or more sessions old: it uses today's hourly read, or says there is no current read. The Feature Store opened from the Data Chart used to accept the chart's cached daily bars up to 4 calendar days old, so on Thursday it could build the daily frame on Monday's close; it now requires the last completed session and otherwise reads the shared history file. The server-side calculators were updated too (deployed with the data service). Refresh the Dispersion and Sticky-Skew tools to see the new reads. See the [Dispersion guide](./dispersion_regime_user_guide.md.html).
- Fixed (new, lightly tested): **The stored risk curves and the trade odds now match the Risk Graph.** The Risk Graph shifts its position curves so the T+0 line passes through your current P&L (which includes the realised P&L of the trade); the stored copy of those curves (what the AI assistant reads) and the Combo Probabilities were taken from the unshifted curves. A trade with 3,772 already realised could therefore read "100% probability of profit today" while the graph and the summary said it was 2,055 down. Both now use the curves as drawn: breakevens, maximum profit and loss, and the probability of profit include the realised P&L. Model-only trades are unchanged. Numbers on trades with realised P&L change.
- Fixed (new, lightly tested): **VSkew columns compare like with like.** When a historical column ("1D Ago") could not reach the target delta on its strike ladder and fell back to a higher one (for example 39 against 25), the Current column stayed at 25 and the change between them mixed two deltas. Current now follows the highest delta any column needed (the row label shows it with a *, as before), also after the history arrives. A middle column can still sit at its own delta.
- Changed (new, lightly tested): **The Outlook says when its technical read runs past its statistics.** The technical read is taken on the round-the-clock proxy, so it includes the overnight session; the section now states the proxy's last bar next to the statistics' last bar. After a daily Dispersion refresh, an existing SPX Outlook older than that refresh is recomputed so its market-internals line matches. The ATM term result carries each expiry's settlement time, and the Sticky-Skew note names the expiry and the settlement date ("2026-12-17 expiry / 2026-12-18 settlement").
- New (lightly tested): **A "leaning" tier in the Outlook tool checks.** A tool whose held-out lift is positive with z of 1.5 or more, but short of the corrected bar, is now listed as leaning (not proven) beside the predictor count, in the CONTRIBUTORS table, the CHAIN verdict and the scenario caution, with its horizon and z. It never counts as a Predictor and the bar is unchanged. The Market Internals line now explains the regime in plain words with the percentiles behind it.
- Fixed (new, lightly tested): **"0 predictors" was partly an artefact.** The tool checks measure forecasting lift only at 5, 10, 21 and 45 bars, but a 1 DTE trade asks the Outlook about 4, where nothing can ever be rated, so every tool read "not rated yet". The Outlook now judges a report horizon at the nearest measured one and says so. Also: the Outlook explains why its three ranges differ (fitted, raw model, implied), why Timing reads NoCycle (the Cycle tool failed its own stability check), and when a regime spell is far longer than any in its history; the HSkew curve no longer lists one expiry twice when the ATM strike moved while it filled; the VSkew note says what a 39% delta reading means against the 25% target.
- Changed (new, lightly tested): **The Outlook states which data it read.** The daily Outlook now prints a "Data:" line (bars, timeframe, first and last date) and warns that a different data source or a shorter history can change the states (the same bar read Vol Expanding on 1509 bars and InLine on 1285). When the fitted volatility bands made no claim, it says InLine is the default, not a measured calm. The Feature Store provenance line was rewritten to say when the volatility parameters were fitted, when they refit next, and that they never saw the current bar.
- Changed (new, lightly tested): **A longer history now gets a longer held-out test.** The held-out tail the tool checks are judged on is no longer fixed at 500 bars: a frame keeps 1000 bars for fitting and holds out the rest, between 500 and 900. A daily frame of about 1500 bars is unchanged; longer hourly and 4-hour frames get more independent blocks, so a tool that really forecasts has a fair chance of being admitted as a predictor. A 45-bar horizon is no longer called impossible; on a short frame it is reported as a data shortage.
- New (lightly tested): **Every Outlook report opens with its own quality assessment.** A "REPORT QUALITY" block at the top gives a grade (SOUND, DESCRIPTION ONLY or THIN) and three gauges: how many applicable tools hold up and how many forecast, how coherent the picture is (states with a reading, backed by a tool that holds up, free of conflicting sources, technical groups reaching a majority), and the evidence depth (independent held-out blocks against the minimum, and whether the 68% range band hit its rate). When the grade is not SOUND it lists what holds it back; the detailed view adds each state's backing tool. The grade rules are fixed and stated in the code, not a score.
- Fixed (new, lightly tested): **The stored ATM term structure no longer collapses to one expiry.** When an Options Analysis window was not on HSkew, it asked IB for only the selected expiry and published that single point over the full term (12 expiries became 1 within minutes), and a set still filling in counted itself complete. The term now waits for every expiry it asked for, and a one-expiry set no longer replaces a wider term stored in the last 12 hours.
- Changed (new, lightly tested): **Stored reports explain themselves.** The Outlook summary now describes the tool checks and "Fix first" in plain words (the Full report keeps the numbers and register rows); the three held-out hit rates are labelled by what they measure (printed range, model sigma bands, ATR band); a Timing state with no stability reading says so instead of printing NaN. Index Statistics carry the definitions of Total/100, IV rank versus IV percentile, and units; the VIX term structure says when the spot is the last close (VIX is not calculated overnight) instead of looking live; Dispersion notes explain the lean score and that a series missing at the last hour may rest on earlier bars.
- Changed (new, lightly tested): **The Outlook report stops contradicting itself in two places.** A Shape of RandomWalk printed beside a VarianceRatio such as 0.72 now says the ratio is "not significantly different from 1, so no departure is claimed". In the technical detail, a tool whose held-out readings are missing despite enough history no longer reads "needs 1000 bars, this frame has 1509"; it says the warm-up does not explain it and the cause is not diagnosed.
- Fixed (new, lightly tested): **GEX/VEX no longer reports a strike gap that was not there.** The stored result counted the strikes it expected as (range width / strike step), which rounded up when the range edges were not on the strike grid, so a complete SPX run read "62 of 64 inputs". It now counts the grid strikes inside the range (62 of 62), and when strikes really are missing the quality note names them ("2 of 62 ladder strikes are not in the result: 5805, 5810").
- New (lightly tested): **The AI assistant refreshes what a trade review needs, and stops quoting old numbers.** A new `run_analysis` name, `refresh_all`, asks the open Options Analysis window to recompute HSkew, VSkew (the selected expiry) and IB GEX/VEX in the background, as current values only (no 1D/2D/1W history, whatever your settings say), whichever mode is on screen; it lists what it started, what is blocked and why, and what you must refresh yourself (sticky regime, dispersion, Data Chart statistics). A stored result from before the last market open or close, or a daily result older than a day or two, is now reported as *unavailable* with the step that refreshes it, instead of being served as a number. The CLAUDE button prompt asks for the refresh first. See the [AI Assistant guide](./ai_assistant_user_guide.md.html).
- Fix (lightly tested): **The chart on screen follows the expiry after a trade loads or an expiry tab changes.** With a trade loaded and the four expiry tabs set, an Options Analysis window showing HSkew, VSkew, GEX, VEX, Hedging Flow, Trace or Vol Surface kept drawing the previous expiry until you switched modes by hand. Once the chain has loaded, the tool on screen now re-applies itself to the chain's expiry and redraws. Risk Graph and Calendar are untouched. The VSkew chart also shows the expiry and trading class it plots in a small box at its top left.
- New (lightly tested): **The AI assistant can open a trade for you, once you have chosen it.** A new `run_analysis` name, `load_trade`, lists your open and monitored trades and asks which one; after you name it, SOAP2 opens it in the Options Analysis window of its symbol (an existing window is reused and its current trade is replaced; the window comes to the front), so the refresh and the trade review have live data. Expired, orphaned and archived trades cannot be loaded. See the [AI Assistant guide](./ai_assistant_user_guide.md.html).
- New (lightly tested): **Unattended trade review.** With `SOAP2_MCP_AUTOSTART=1` set on the AI assistant connection, a trade review, refresh or trade load starts SOAP2 for you when it is closed (`SOAP.exe --unattended`: no pop-ups, never a second copy), waits for the Interactive Brokers connection and then answers. TWS must already be running and logged in (an unattended SOAP2 never starts TWS itself), SOAP2 stays open afterwards, and it is off unless you set the variable. The guide also explains how to follow it from your phone with Claude Code Remote Control. See the [AI Assistant guide](./ai_assistant_user_guide.md.html).
- New (lightly tested): **Filter the Options Analysis trade box by category.** A new box left of the trade box lists All (the default on every open) or one trade category, so the trade box is no longer crowded by a long list. The trade you have open stays listed, with the box tinted and the note "Current trade not in selected category", so the selection never jumps. "Add Trades to View" and the Calendar trade list are not filtered. A trade whose positions are not loaded counts as Other.
- New (lightly tested): **Rebuild a closed trade from its fills.** Restore on a closed (net flat) archived trade, in the Trade List Archived view, used to bring back a flat trade with nothing to plot that was archived again at the next start. It now offers the earlier open states of the trade (one per fill time, oldest to newest, the step before the closing preselected) and rebuilds the one you pick as a NEW trade named "..._reconstructed" (rename it afterwards); the archived original is kept. The dialog says it plainly: the closing fills happened at Interactive Brokers, so the account holds no such position, and the P&L, Trade Reports and margin of a reconstructed trade will not match the account. Study and plotting only.
- New (lightly tested): **The Trade List now explains special rows.** Expired (-3), orphaned (-2) and closed trades that were restored (held in Active for the session, archived again after a restart if still flat) show greyed, with a tooltip on the Status cell saying why; the footer counts them and its legend now includes -3. The [Trade List guide](./TradeList.md.html) has a new "Why a trade gets archived" section that defines closed/flat, expired, orphaned and archived, and lists every reason a trade is archived, and a "Right-click Menu" section that describes each entry. The Delete confirmation now says it archives the trade and that nothing is erased (the right-click entry reads "Delete (archive)"). Five more playlist videos are linked from the guides they belong to.
- New: **What Happens at Startup** guide. Lists in order what SOAP2 does by itself when it starts (loading, connecting, chain requests, the first Options Analysis window) and every background job, with how often it runs, what it costs and which edition it needs. Written from the code, not live-checked. See the [What Happens at Startup guide](./startup_user_guide.md.html).
- Changed (new, lightly tested): **A trade with an unquoted leg now opens in the Options Analysis.** Before, a trade whose legs had no live quote after about 3 seconds (overnight, a far wing) fell back to the Model Trade. It now opens, shows a message, and uses the close or mark price of such a leg where one is known.
- Changed (new, lightly tested): **Account rules go Stale on old figures.** A cushion, margin-to-equity or similar account rule now reads Stale when IB's account summary has not updated for 15 minutes, instead of staying green on old numbers.
- Fixed (new, lightly tested): **Unexpected errors are logged.** An unhandled error on the main thread or in a background task is now written once to CrashReport.txt and the Message Log, without a dialog. Moving a trade to another account now stops if the copy failed, instead of archiving the original.
- New: **Market Statistics, the Feature Store without a chart.** A new entry on the Data Chart menu opens the statistics window (range, volatility, regime, cycle, levels, plain-words outlook) for the index selected on the main form, with no Data Chart open. It is enabled for SPX, NDX and RUT (Expert tools). A small window first asks for the bar size (1 hour, 4 hours or 1 day), whether to read the technicals on the round-the-clock proxy, and offers "Parameters..." (cycle range, trend window, Murrey Math and JMA; they start as your Data Chart defaults and are saved on their own). The statistics stay on the index's own bars. With the proxy ticked (the default for SPX and NDX; RUT has none), the technical read (momentum, levels, cycle, turning points) is taken on IBUS500 or IBUST100, which trade round the clock, with the cycle range and the trend window scaled to the proxy's bars per day; the report says which series each part was read on, and levels are in the proxy's prices, a few points off the index. A proxy that cannot be fetched falls back to the index's own read and says so. The first load fetches the proxy's history from IB (about four years of hourly bars, paced, so it is slow once). The Data Chart's own "Feature Store..." button is unchanged. New and lightly tested. See the [Market Statistics guide](./market_statistics_user_guide.md.html). The report is now laid out with headings and colour-coded states, and an advanced Columns menu (View) helps to choose which readings are plotted under the price.
- Changed: **The background Outlook follows the same proxy switch and the same parameters as Market Statistics.** Market Statistics and the 30-minute background run write the same report files, so both now read the technicals on the same series and use the same parameters (your saved Feature Store parameters, which start as your Data Chart defaults, instead of the built-in register values). Market Outlook and the AI assistant's get_outlook therefore show an "off the register" note wherever your values differ (for example JMA length 7 against 9) and say when the technical read was taken on the proxy. The first run after updating recomputes everything once with the new values, and changing "Parameters..." now changes the background Outlook too. New and lightly tested.
- Changed: **The Data Chart shows pivots by default.** "Show Pivots" is now on for new charts, and turned on once for existing saved settings; untick it and your choice stays.
- New: **The Outlook report opens with a calibrated RANGE.** It shows the typical (about 68%) and unusual (about 95%) move over the report's horizon, blended from the volatility models and rescaled by how often past ranges actually held, and says how many finished periods it was checked on and the measured hit rate (a short record is flagged). With too little history it shows the model volatility unadjusted and says "uncalibrated". The plain-words text uses it when it exists. A background run can also log each range to a score ledger so the hit rate can be audited later (off by default; nothing is logged from the dashboard). The AI assistant's get_outlook answer carries the same range (with its hit rate and period count). New and lightly tested: the hit rates have only been checked on historical SPX, and the assistant needs its SOAP2.Mcp component rebuilt to see the new wording.
- Changed: **No reading looks further than 4 bars ahead.** Every timeframe now defaults to a 4-bar horizon (4 hours hourly, about 2 days on 4H, 4 trading days daily), and the plain-words text has three parts instead of two: NEXT FEW HOURS (hourly bars), NEXT DAY OR TWO (4-hour bars) and NEXT FEW DAYS (daily bars), each saying which bars it was read from and leading with the Range (typical move, levels, how often that band held). When no drift is measurable, the text now says whether the price averages and nearby price levels lean one way (a modest or faint inclination, or that they cancel); it describes the tools' picture and has not been shown to predict. "The coming weeks" is gone. Range bands and ledger rows restart at the new horizon, so earlier hit rates do not carry over. New and lightly tested.
- New: **The plain-words text now names the key price level.** When price is approaching, at, hovering around, or has just been turned back from (or pushed through) the 0/8, 4/8 or 8/8 line of the Murrey grid, each term says so in one sentence. The report viewer's folded detail still shows the lines the report marked notable under "Worth noticing", and the "Technical detail" tick box is greyed out on the plain-words views, where it has nothing to show. New and lightly tested.
- Changed: **The stored-report viewer opens on the short reading.** RANGE, TECHNICAL READ, REGIME, OUTLOOK and the cross-timeframe view show by default; the per-tool list ("What the tools say") and the band-maintenance log now sit behind the "Technical detail" tick box with the audit trail. Nothing is removed. New and lightly tested.
- Changed: **The Outlook dashboard's chart and column list are now two separate switches.** Under View, "Columns (advanced)" shows the column list and "Chart (advanced)" shows the chart, each on its own (either, both or neither). The ticked columns still print in the report for the bar you read, and still feed the chart, whether or not the list is on screen. Settings saved before this keep the list they had. New and lightly tested.
- New: **The Outlook guide was rewritten in plain words** ("SOAP2 Outlook Multi-Timeframe Starter Guide"): what the range, the three plain-words terms, the technical read and the regime memory mean, with a glossary, for readers with no statistics background.
- Changed: **The trade-expiry views in the full report are capped at 4 bars too.** The days-to-expiry box used to make a 30-day trade read the daily chart 21 bars ahead; no view now looks further than 4 bars of its own chart, and the line says what the trade asked for ("the trade looks 21 ahead; nothing is trusted beyond 4"). The box now changes which views are listed more than how far they look. New and lightly tested.
- Improved: **When the hourly, 4-hour and daily charts disagree, the plain-words text now says what each one read** (for example "volatility: the hourly bars read contracting, the daily bars read expanding") instead of only that they differ, and the cautious reading is shown as before. The AI assistant gets the same detail (`frame_states`) so it does not mistake the cautious "in line" for a measured average. New and lightly tested.
- Changed: **The plain-words text says when its inclinations were read on the round-the-clock proxy** (one footer line: "The inclinations (price averages and price levels) were read on IBUS500, all hours, not on the index itself; the ranges and the volatility are the index's.").
- New: **The Outlook report has a TECHNICAL READ section after the RANGE.** It groups the price-action tools into three short readings, each the majority of its members and never a score: Momentum (ALMA, JMA and their cross), Levels (zigzag leg, channel breakout, last fractal pivot, floor-pivot side of the pivot, Murrey line test) and Turning (the cycle stochastic: "pivot high/low near" when the fast line departs from the other two in an overbought or oversold zone). Timing appears only while the cycle is stable, and a tool the regulator has muted never takes part. It describes conditions and is not a forecast. New and lightly tested.
- New: **The Outlook report has a REGIME MEMORY section** for volatility and for how price behaves. It says how long the current state has lasted, how long such states usually last, and, once at least 10 past spells of it have ended, what followed them and how often, with a range that widens when the count is small. It is counted from SOAP2's own past states, not fitted and not a forecast; on a short history it says "too few past spells" instead of printing odds. New and lightly tested.
- Fixed: **the same "On the four-hour view ..." sentence is no longer printed twice** in the plain-words Outlook, and the zigzag line in the report notes is now called "Swing hold" so it is not confused with the cycle-pivot "Pivot hold" tool.
- Fixed: **Trade Log, rename and delete are safer.** Renaming a trade to a name already in use, or one containing any of `, \ / : * ? " |`, is now refused with a clear message and the old name is kept (it used to overwrite the other trade's file silently); the trade's Back/Forward history follows a rename. Deleting or moving a trade stops, with a message, when its file cannot be archived (it used to carry on and could lose the trade), and Trades List rows are matched by exact trade name when removed. A comma typed into a Trade Log note or description is saved as a semicolon, because a comma used to shift the settlement price of that leg out of its column the next time the trade loaded. Checked live on test data; the settlement price after a reload is still to be checked.
- Fixed: **Option Greeks for symbols that pay a dividend.** Where SOAP2's own model supplies the number (not IB's), put delta, theta, vega, vanna and vomma now include the dividend yield, and rho uses the right time term. Index options with no dividend are unchanged. Checked by 64 unit tests only; not yet compared with live prices.
- Fixed: **Commissions are shown as recorded.** The Options Analysis save no longer replaces a commission of 0 with the preset fee, so trade files, Reports, Portfolio and the AI assistant show what IB reported (0 where IB reported 0). The Risk Graph's commission switch works as before. New and lightly tested (needs real fills).
- Fixed: **Each Options Analysis window keeps its own expiry list.** Opening an analysis on RUT or a stock no longer changes the weekly and monthly expiries, or the AM/PM settlement marking, of an SPX window that is already open. Checked live with SPX and RUT.
- Fixed: **Bank holidays: Lincoln's Birthday, Truman Day and other state-only holidays no longer count as market closures.** Only the ten exchange closures default to "market closed" (New Year's Day, Martin Luther King Day, Presidents Day, Good Friday, Memorial Day, Juneteenth, Independence Day, Labor Day, Thanksgiving, Christmas); Columbus, Indigenous Peoples' and Veterans Day stay open. Days-to-expiry (DTE) and expected moves that cross 2027-02-12 or 2027-05-08 change by a day. You can still toggle any date in Bank Holidays (Settings & Windows). A holiday you had toggled yourself keeps your choice, except the state-only ones.
- Fixed: **A damaged settings file no longer stops SOAP2 from starting.** A `soapconfig.json` that cannot be read is kept as `soapconfig.corrupt-