Release note
The strategy agent refuses instead of guessing, and only charges for real runs
We went through the strategy agent with one rule: never show a number the system didn't calculate, and never run something other than what you asked for without saying so.
No stand-in results. When the backtest engine couldn't run a request (no price data for a symbol, not enough history, or a strategy type it doesn't support), it could hand back placeholder figures that looked like a real backtest. It now refuses with a specific reason and names any symbols it has no data for. A refused run is marked as failed, nothing is saved or cached, and your tokens are refunded once.
You're only charged for runs that happen. If the agent needs to ask you a clarifying question, or your prompt is something it can't run, nothing is charged. Symbols with no price data are caught before any charge. If the AI model that reads your prompt is unavailable, the agent tells you the problem is on our side and that nothing was run or charged, rather than asking you to rephrase.
It runs what you asked for. The headline result is now the strategy you described. Before, the agent could promote the best-scoring of several variants to the headline, which quietly swapped your parameters and picked the winner in-sample. The agent also sticks to the strategy type it recognised in your prompt, and more plain-English descriptions, such as "hold the 5 stocks with the best 6-month return", now map to the right strategy.
The prompt box keeps every keystroke. A bug could drop characters as you typed and leave the Send button doing nothing. That's fixed, and if a message can't be sent, the box now tells you why. Past sessions that fail to load now say so instead of showing an empty stub.
Result card labels that match the maths. The "live" tags next to backtest numbers are gone. Trade counts show closed round trips and rebalances instead of "0 trades". On monthly data, annualised volatility was overstated (a 4.4% monthly volatility showed as 69.7%) and is now correct, and tail risk and drawdown durations are labelled in months. The check we called "walk-forward / out-of-sample" re-tests the same fixed parameters on separate time slices, so it's now labelled time-slice stability and no longer counts towards the overfitting score. The "60/40" benchmark is labelled "50/50 SPY + TLT", which is what it runs, and the chart legend names the benchmark you chose. The survivorship-bias banner no longer appears on strategies that hold only ETFs.
Optimise and compare. The optimise panel now changes the parameters the engine actually reads, and flags it when different settings produce identical results. The compare page shows the metrics stored with each strategy; CAGR and drawdown had been blank there.