The paper trading agent does not ask a model whether to trade. Its confidence score is a deterministic weighted blend of seven auditable subscores, liquidity, volatility regime, structure fit, event risk, portfolio fit, tape fit and directional bias, with weights that sum to one. A set of blocking flags, such as an earnings date before expiry or a bid-ask spread wider than the limit, forces a reject regardless of the blend. A candidate below 50 is journaled and rejected, one at 75 or above sits in the approve band, and everything between waits for a human. Full automation exists only on paper; in a production account every order needs a click.
How these pages were written: from the engine source as deployed in September 2026, with thresholds quoted as the code holds them. Thresholds change with releases and the changelog records each change. This is a description of arithmetic, not advice about what to trade.
Source module: strategy/auto_agent.py, function confidence_score and the CONFIDENCE_WEIGHTS table.
Each subscore is 0-100 and the blend is a weighted sum:
| Subscore | Weight | What it reads |
|---|---|---|
| Liquidity | 0.18 | Bid-ask width as a share of mid, open interest and volume on the short leg |
| Volatility regime | 0.18 | Implied-volatility rank and NVRP against the entry floors |
| Structure fit | 0.18 | Credit received per dollar of width, probability of profit, and skew against the side |
| Event risk | 0.14 | Earnings and scheduled macro events inside the holding window |
| Portfolio fit | 0.09 | The open-risk budget and per-symbol concentration the entry would leave |
| Tape fit | 0.13 | Strike placement against the chart, on its own page |
| Directional bias | 0.10 | Whether the agent's own directional read opposes the vertical |
The weights are not equal, and the reason is recorded in the code: liquidity, structure fit and portfolio fit gave up weight when tape fit joined, because their floors are already hard-enforced elsewhere by the entry filters and the risk budget, so they carry less marginal information than the one signal nothing else in the pipeline sees. Directional bias was carved out of the other six proportionally rather than added on top, so the weights still sum to one.
A blocking flag forces a reject no matter how the blend scores. The flags are: bid-ask too wide, implied-volatility rank unavailable, NVRP unavailable, credit below the minimum credit-to-width, debit above the maximum debit-to-width, an earnings date before expiry, a critical macro event within a day, and a chain that is not real time. Two of these are worth a second look. "Unavailable" is a block, not a pass: the agent never treats a number it could not compute as if it had come back favorable. And "chain not real time" blocks because the spread-based checks are only valid on a live quote; a delayed feed reads spreads three to five times wider than they are.
The house defaults, each of which the user can change in the agent settings and which the agent surface records as an adopted rule set: 25 to 50 days to expiry, a short-strike delta of 0.15 to 0.25, implied-volatility rank of at least 35, NVRP of at least 0.10, at least 250 open interest and 50 contracts of volume on the short leg, an average leg bid-ask width of no more than 25 percent of mid, a credit of at least 20 percent of width, and a quiet period of 15 minutes after the open before any entry. Risk limits sit beside them: a maximum loss per trade of 6 percent of agent capital, total open risk of 40 percent, and a daily loss stop of 5 percent, realized plus unrealized.
A second, statistical opinion can sit on top: when a meta-label model is trained, full-auto entries additionally require its probability to clear a floor. An absent model degrades to confidence-only gating, never to no gating, and the dual gate can only subtract from what full-auto would do, never add to it or block the human-approval path.
Because the split is enforced in code, not configuration. Unattended submission is refused outside the paper planes regardless of settings: a production order needs a human approval and a typed confirmation that is passed end to end and checked again inside the order path. An action staged by the AI assistant always requires the deliberate confirm in the queue, however well it scores, and a spoken "yes" is not a confirmation. The one unattended production path is a standing authorization for entries below a dollar limit the user has typed in, and that path exists for entries only. The agent's rejections are audited on their own page, and the agent review describes what the first months of paper trading showed.
With a deterministic weighted blend of seven 0-100 subscores: liquidity 0.18, volatility regime 0.18, structure fit 0.18, event risk 0.14, portfolio fit 0.09, tape fit 0.13 and directional bias 0.10. Blocking flags force a reject regardless of the blend, a score below 50 is rejected, 75 and above is the approve band, and the range between waits for a human.
A bid-ask spread wider than the limit, an implied-volatility rank or NVRP that could not be computed, a credit below the minimum credit-to-width or a debit above the maximum, an earnings date before expiry, a critical macro event within a day, or a chain that is not real time.
No. Unattended submission is refused outside the paper planes in code, regardless of settings. A production order needs a human approval and a typed confirmation that is checked again inside the order path; the one exception is a standing authorization for entries below a dollar limit the user has typed in.
More in Methodology: how the engine computes: How Exit Rules Are Applied to Open Positions · How the Conviction Score Is Computed · How a Structure Is Chosen: Signal, Volatility, VIX