Configuration reference
Where Forven keeps its configuration, the order settings are resolved in, and the pipeline threshold groups — stance preset, quick-screen, gauntlet, walk-forward, robustness, paper→live, safety floors, and the live ramp.
Forven reads its configuration from a layered stack: the process environment, a key-value (KV) store inside its SQLite database, an on-disk config.json, and built-in defaults. This page is the operator's reference to that stack — where each layer lives, the order it is consulted in, and the pipeline threshold groups you are most likely to touch. For environment variables, see environment variables. For the friendly UI over nearly all of this, see Settings.
Forven is a research tool. The thresholds described here govern a validation process — they do not create an edge, and no configuration guarantees against loss. Numbers below are illustrative defaults from the current build, not predictions, recommendations, or financial advice.
Where configuration lives
Everything Forven stores lives under one root directory, FORVEN_HOME — ~/.forven by default (on Windows, %USERPROFILE%\.forven). It holds:
forven.db— the main SQLite database, including the KV settings table. Almost everything you change in the app is stored here.forven_lab.db— the lab database.config.json— a small file of file-based settings, consulted below the KV store.auth.json— encrypted provider and exchange credentials (the key that decrypts them lives elsewhere; see encryption & secrets).workspace/— the operator profile and AI workspace files.backups/— database snapshots (see Updating & backups).
Market data (the Parquet data lake) lives under FORVEN_HOME/data or the repository's data/ folder, depending on how you launch — see FORVEN_DATA_DIR.
If a legacy home from an earlier build exists (~/.juddex or ~/.judex), Forven merges it into ~/.forven on first run and renames the database files (juddex.db → forven.db). You do not migrate by hand.
# Inspect your Forven home on Windows
Get-ChildItem "$env:USERPROFILE\.forven"Precedence: how a setting is resolved
When Forven needs a value, it consults four layers in order. The first layer that defines the key wins:
- Environment variable (highest). Process-level overrides such as
FORVEN_HOME,FORVEN_PORT,FORVEN_EXECUTION_MODE, andFORVEN_ALLOW_MAINNET. A safety flag set here cannot be relaxed from inside the app — that ordering is deliberate. - KV store. Runtime settings written by the app and the API. The main keys:
forven:settings— the general settings blob behind most of the Settings page.forven:pipeline_thresholds— every promotion-gate threshold on this page.forven:pipeline:settings— pipeline cadence, throughput, and per-stage work-in-progress caps.system_state— the system pause flag and the autonomy mode.
config.jsonon disk. A file-based fallback for a handful of settings (for example the backup AI provider and some regime-gate options).- Built-in defaults (lowest). For pipeline thresholds, that is the canonical default configuration shipped with the app — the Default stance.
Config self-heals on load. Each time pipeline thresholds load, they are reconciled against the current defaults: missing keys are filled in, values stored as percentages are converted back to fractions, and structurally unsafe values are repaired with a warning. For example, a stored config that drops
walk_forwardfrom the required gauntlet tests has it restored, because without it nothing meaningful gates the path to paper.
How pipeline thresholds resolve
The promotion-gate thresholds are resolved in three steps:
- Stance preset.
pipeline_preset—relaxed,default,strict, orcustom— sets every threshold in one move. Choose it in Settings → Lab → Pipeline stance. Editing any single knob flips it tocustom, which uses your per-knob values as they are. - Your overrides, stored in
forven:pipeline_thresholds. - Safety floors clamp the result, so no preset, custom value, or automated caller can soften a gate past them. See safety floors.
The side-by-side comparison of the three presets is on the promotion gates page. The tables below give the Default stance.
The pipeline threshold groups
Drawdowns and returns are stored as fractions (0.30 = 30%), even though the app displays them as percentages.
quick_screen — the triage gate
quick_screen is the cheap first gate, run before a strategy is allowed to spend compute in the gauntlet.
| Key | Meaning | Default |
|---|---|---|
quick_screen.min_trades | Reject below this trade count. | 20 |
quick_screen.min_profit_factor | Reject if profit factor is below this at either IS or OOS. | 1.0 |
quick_screen.min_is_sharpe | Reject a negative in-sample edge. | 0.0 |
quick_screen.min_sharpe | Out-of-sample Sharpe floor. | 0.0 |
quick_screen.max_is_oos_ratio | Reject if IS Sharpe exceeds OOS Sharpe by more than this multiple (an overfitting signature). | 3.0 |
quick_screen.max_is_maxdd_pct | Maximum in-sample drawdown. | 0.30 |
quick_screen.min_robustness_score | Robustness floor before the gauntlet. 0 because the score is earned inside the gauntlet. | 0 |
quick_screen.min_win_rate | Win-rate floor. Off — momentum and breakout families profit at 30–40% win rates. | 0.0 |
quick_screen.max_plausible_sharpe | Reject Sharpe at or above this as a look-ahead leak signature. | 5.0 |
quick_screen.max_plausible_profit_factor | Reject profit factor at or above this as a look-ahead leak signature. | 8.0 |
A tail-risk trap sits outside the config: a win rate above 70% with a profit factor below 1.5 is rejected as a martingale-shaped curve.
gauntlet — the gauntlet→paper gate
gauntlet governs the gauntlet robustness battery and the deliberately achievable gate into paper.
| Key | Meaning | Default |
|---|---|---|
gauntlet.required_tests | Tests that must pass. | ["walk_forward", "param_jitter"] |
gauntlet.min_robustness_score | Minimum robustness score (out of 100). | 30 |
gauntlet.min_trades | Minimum trade count. | 20 |
gauntlet.min_sharpe | Minimum Sharpe. | 0.1 |
gauntlet.hard_min_is_sharpe | Hard in-sample Sharpe floor at gauntlet entry. | 0.0 |
gauntlet.max_drawdown_pct | Maximum drawdown. | 0.30 |
gauntlet.min_oos_profit_factor | Minimum out-of-sample profit factor. | 1.05 |
gauntlet.mc_max_dd_p95 | Monte-Carlo 95th-percentile drawdown ceiling. | 0.40 |
gauntlet.wfa_max_degradation | Walk-forward: maximum IS→OOS Sharpe degradation. | 0.35 |
gauntlet.wfa_min_oos_trades | Walk-forward: minimum out-of-sample trades. | 20 |
gauntlet.wfa_min_folds | Walk-forward: minimum judgeable folds. | 2 |
gauntlet.async_result_max_age_minutes | Minutes an async result may stay "running" before it is resubmitted. | 60 |
The five robustness tests are walk_forward, monte_carlo, param_jitter, cost_stress, and regime_split, ordered cheap-first so weak strategies fail fast. The Strict stance adds cost_stress to the required list.
walk_forward — the out-of-sample simulator
| Key | Meaning | Default |
|---|---|---|
walk_forward.n_folds | Number of walk-forward folds. | 5 |
walk_forward.in_sample_pct | Share of each fold used for training; the rest is out-of-sample. | 0.70 |
walk_forward.max_bars | Maximum candles per fold (a compute bound). | 50000 |
walk_forward.min_oos_days_1h | Minimum out-of-sample days per fold at 1h. | 30 |
walk_forward.fee_bps | Fee applied in walk-forward, in basis points. | 4.5 |
walk_forward.slippage_bps | Slippage applied in walk-forward, in basis points. | 2.0 |
robustness_thresholds — the per-test pass marks
| Key | Meaning | Default |
|---|---|---|
robustness_thresholds.monte_carlo_percentile_min | Monte-Carlo: minimum share of profitable resamples. | 0.65 |
robustness_thresholds.param_jitter_pass_rate_min | Parameter jitter: minimum share of reruns that pass. | 0.50 |
robustness_thresholds.param_jitter_min_trades | Baseline trades needed before a jitter sweep runs. | 10 |
robustness_thresholds.param_jitter_max_iterations | Cap on jitter reruns. | 30 |
robustness_thresholds.cost_stress_max_degradation_pct | Cost stress: maximum Sharpe degradation under 2× fees and slippage (percentage points). | 60.0 |
robustness_thresholds.cost_stress_min_sharpe | Cost stress: minimum stressed Sharpe. | 0.3 |
robustness_thresholds.regime_split_profitable_min | Regime split: minimum share of regimes that must be profitable. | 0.50 |
robustness_thresholds.regime_split_min_trades_per_regime | Trades a regime needs before it counts. | 5 |
robustness_thresholds.wfa_fold_pass_rate_min | Walk-forward: minimum share of judged folds with positive OOS Sharpe. | 0.33 |
robustness_thresholds.wfa_min_fold_trades | Out-of-sample trades a fold needs before it is judged. | 5 |
robustness_thresholds.deflated_sharpe_gate_enabled | Reject on the deflated Sharpe ratio. Always computed; the gate is opt-in. | false |
robustness_thresholds.min_deflated_sharpe | Deflated-Sharpe floor when the gate is on. | 0.90 |
paper_trading — the strict paper→live gate
The gauntlet→paper gate is deliberately achievable. The paper_trading group is the strict gate that protects real capital. (The public site calls a strategy at this stage a candidate; the stage name is paper.)
| Key | Meaning | Default |
|---|---|---|
paper_trading.min_paper_days | Minimum days in paper. | 14 |
paper_trading.min_closed_trades | Minimum closed paper trades. | 10 |
paper_trading.min_total_return_pct | Paper return must exceed this. | 0.0 |
paper_trading.max_drawdown_pct | Maximum paper drawdown. | 0.15 |
paper_trading.min_paper_sharpe | Minimum per-trade t-statistic (forward-edge proof). | 1.0 |
paper_trading.min_profit_factor_paper | Minimum paper profit factor. | 1.2 |
paper_trading.min_profit_factor_live | Historical (OOS) profit-factor floor for live. | 1.5 |
paper_trading.pf_position_reduction_threshold | Below this profit factor, a strategy is admitted at half size. | 2.0 |
paper_trading.max_oos_is_ratio | Out-of-sample Sharpe may not exceed in-sample by more than this multiple. | 1.5 |
paper_trading.live_strict_robustness_enabled | Re-enforce the full robustness battery at this gate. | true |
Live promotion is never automatic: whatever these thresholds say, moving a strategy to live requires you to type GO LIVE. See promotion gates.
safety_floors — the absolute rails
Safety floors clamp the gates from outside the preset system. They are editable in Settings → Lab → Safety floors; set a floor to 0 (or a ceiling to 1.0) to remove that rail.
| Key | Clamps | Default |
|---|---|---|
safety_floors.min_trades | Trade count behind a →paper promotion. | 3 |
safety_floors.wfa_min_folds | Judgeable walk-forward folds. | 2 |
safety_floors.wfa_fold_pass_rate_min | Walk-forward fold pass rate. | 0.20 |
safety_floors.param_jitter_pass_rate_min | Parameter-jitter pass rate. | 0.30 |
safety_floors.mc_max_dd_p95 | Monte-Carlo tail drawdown (a ceiling). | 0.50 |
safety_floors.live_min_closed_trades | Closed paper trades behind a →live promotion. | 3 |
safety_floors.live_max_drawdown_pct | Paper drawdown behind a →live promotion (a ceiling). | 0.25 |
The live_* floors guard the real-money gate. Loosen those with care.
live_graduated, dethrone, and testing_mode
| Key | Meaning | Default |
|---|---|---|
live_graduated.allocation_schedule | Performance-gated allocation ramp: 25% in weeks 1–2, 50% in weeks 3–4, 100% from week 5. Flagged drift holds it at 25%. | (see below) |
live_graduated.decay_kill_switch_pct | Sharpe degradation, over a 72-hour window, that retires a live strategy. | 0.30 |
dethrone.paper_min_soak_days / paper_max_soak_days | How long a new paper strategy is protected from being recommended for replacement. | 7 / 14 |
dethrone.paper_min_closed_trades | After the minimum soak, a strategy with fewer closed trades than this stays protected until the maximum. | 5 |
testing_mode | Bypass the quick-screen and gauntlet gates for rapid iteration. Never bypasses the paper or live gates. | false |
"live_graduated": {
"allocation_schedule": [
{"week_start": 1, "week_end": 2, "allocation_pct": 25},
{"week_start": 3, "week_end": 4, "allocation_pct": 50},
{"week_start": 5, "week_end": 999, "allocation_pct": 100}
]
}Other runtime settings
Several operational settings live in the KV store and are set from the app:
- Throughput and cadence — the throughput preset in Settings → System → Throughput writes real values into the loop intervals, worker counts, and daily develop budget. The scheduler page covers the jobs themselves.
- Backtest windows — the default window and the per-stage windows in Settings → Lab. See backtesting.
- System state —
system_stateholds the pause flag and the autonomy mode (manual,semi_auto, orauto). - Notification preferences —
forven:notification_preferencesroutes events to the in-app inbox or Discord. See notifications. - Retention windows — keys such as
retention_activity_log_days(default 90) drive the database pruning job. See maintenance.
Steps: change a pipeline threshold safely
Tune the pipeline from the app rather than editing stored JSON by hand:
- Open Settings → Lab. Pick a Pipeline stance first; it sets every gate at once.
- To change a single knob, edit it in the Lab section. The stance flips to Custom. Drawdowns and returns are shown as percentages and stored as fractions.
- Save. The value is written to
forven:pipeline_thresholds. - On the next load it is normalized and clamped by the safety floors.
- Promotions evaluated from then on use it. The pipeline board shows which gate each strategy is waiting on.
# Read the resolved pipeline settings over the local API
# (if FORVEN_API_KEY is set, send it in the x-api-key header)
Invoke-RestMethod -Uri "http://127.0.0.1:8003/api/settings/pipeline"What you'll see
After you save, the Settings form shows the new value and the stance reads Custom. GET /api/settings/pipeline returns the resolved config on the next load. A value looser than a safety floor is clamped to the floor — the gate enforces the floor regardless of what you stored, unless you change the floor itself.
Caveats
- Environment beats everything.
FORVEN_EXECUTION_MODEandFORVEN_ALLOW_MAINNETare read from the environment and cannot be relaxed from the app. Paper is the default and supported mode; mainnet is default-deny and unsupported. - Fractions, not percentages. Drawdown and return keys are stored as fractions (
0.30= 30%). - Safety floors win. A preset or custom value can't go below them; only changing the floor itself can.
- Stale config self-heals. Missing or unsafe keys are repaired on load — don't rely on hand edits to remove a required test; it will be restored.
- The defaults on this page are illustrative values from the current build, not guarantees, and may change between releases.
Related
- Promotion gates — stance presets side by side, and how these thresholds are enforced
- Environment variables — the variables at the top of the precedence stack
- Settings — the app hub that writes most of these values
- The gauntlet — the robustness tests these thresholds judge
MCP tools reference
Complete catalog of the 20 Forven MCP tools — names, purpose, key parameters, return shapes, the backing endpoints, the compact backtest payload, and how gates are reported.
Environment variables
Complete reference for Forven's environment variables — startup, paths, safety, auth, encryption, AI, integrations, backups, launcher flags, and runtime tuning, with meanings and defaults.