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:

  1. Environment variable (highest). Process-level overrides such as FORVEN_HOME, FORVEN_PORT, FORVEN_EXECUTION_MODE, and FORVEN_ALLOW_MAINNET. A safety flag set here cannot be relaxed from inside the app — that ordering is deliberate.
  2. 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.
  3. config.json on disk. A file-based fallback for a handful of settings (for example the backup AI provider and some regime-gate options).
  4. 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_forward from 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:

  1. Stance preset. pipeline_preset — relaxed, default, strict, or custom — sets every threshold in one move. Choose it in Settings → Lab → Pipeline stance. Editing any single knob flips it to custom, which uses your per-knob values as they are.
  2. Your overrides, stored in forven:pipeline_thresholds.
  3. 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.

KeyMeaningDefault
quick_screen.min_tradesReject below this trade count.20
quick_screen.min_profit_factorReject if profit factor is below this at either IS or OOS.1.0
quick_screen.min_is_sharpeReject a negative in-sample edge.0.0
quick_screen.min_sharpeOut-of-sample Sharpe floor.0.0
quick_screen.max_is_oos_ratioReject if IS Sharpe exceeds OOS Sharpe by more than this multiple (an overfitting signature).3.0
quick_screen.max_is_maxdd_pctMaximum in-sample drawdown.0.30
quick_screen.min_robustness_scoreRobustness floor before the gauntlet. 0 because the score is earned inside the gauntlet.0
quick_screen.min_win_rateWin-rate floor. Off — momentum and breakout families profit at 30–40% win rates.0.0
quick_screen.max_plausible_sharpeReject Sharpe at or above this as a look-ahead leak signature.5.0
quick_screen.max_plausible_profit_factorReject 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.

KeyMeaningDefault
gauntlet.required_testsTests that must pass.["walk_forward", "param_jitter"]
gauntlet.min_robustness_scoreMinimum robustness score (out of 100).30
gauntlet.min_tradesMinimum trade count.20
gauntlet.min_sharpeMinimum Sharpe.0.1
gauntlet.hard_min_is_sharpeHard in-sample Sharpe floor at gauntlet entry.0.0
gauntlet.max_drawdown_pctMaximum drawdown.0.30
gauntlet.min_oos_profit_factorMinimum out-of-sample profit factor.1.05
gauntlet.mc_max_dd_p95Monte-Carlo 95th-percentile drawdown ceiling.0.40
gauntlet.wfa_max_degradationWalk-forward: maximum IS→OOS Sharpe degradation.0.35
gauntlet.wfa_min_oos_tradesWalk-forward: minimum out-of-sample trades.20
gauntlet.wfa_min_foldsWalk-forward: minimum judgeable folds.2
gauntlet.async_result_max_age_minutesMinutes 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

KeyMeaningDefault
walk_forward.n_foldsNumber of walk-forward folds.5
walk_forward.in_sample_pctShare of each fold used for training; the rest is out-of-sample.0.70
walk_forward.max_barsMaximum candles per fold (a compute bound).50000
walk_forward.min_oos_days_1hMinimum out-of-sample days per fold at 1h.30
walk_forward.fee_bpsFee applied in walk-forward, in basis points.4.5
walk_forward.slippage_bpsSlippage applied in walk-forward, in basis points.2.0

robustness_thresholds — the per-test pass marks

KeyMeaningDefault
robustness_thresholds.monte_carlo_percentile_minMonte-Carlo: minimum share of profitable resamples.0.65
robustness_thresholds.param_jitter_pass_rate_minParameter jitter: minimum share of reruns that pass.0.50
robustness_thresholds.param_jitter_min_tradesBaseline trades needed before a jitter sweep runs.10
robustness_thresholds.param_jitter_max_iterationsCap on jitter reruns.30
robustness_thresholds.cost_stress_max_degradation_pctCost stress: maximum Sharpe degradation under 2× fees and slippage (percentage points).60.0
robustness_thresholds.cost_stress_min_sharpeCost stress: minimum stressed Sharpe.0.3
robustness_thresholds.regime_split_profitable_minRegime split: minimum share of regimes that must be profitable.0.50
robustness_thresholds.regime_split_min_trades_per_regimeTrades a regime needs before it counts.5
robustness_thresholds.wfa_fold_pass_rate_minWalk-forward: minimum share of judged folds with positive OOS Sharpe.0.33
robustness_thresholds.wfa_min_fold_tradesOut-of-sample trades a fold needs before it is judged.5
robustness_thresholds.deflated_sharpe_gate_enabledReject on the deflated Sharpe ratio. Always computed; the gate is opt-in.false
robustness_thresholds.min_deflated_sharpeDeflated-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.)

KeyMeaningDefault
paper_trading.min_paper_daysMinimum days in paper.14
paper_trading.min_closed_tradesMinimum closed paper trades.10
paper_trading.min_total_return_pctPaper return must exceed this.0.0
paper_trading.max_drawdown_pctMaximum paper drawdown.0.15
paper_trading.min_paper_sharpeMinimum per-trade t-statistic (forward-edge proof).1.0
paper_trading.min_profit_factor_paperMinimum paper profit factor.1.2
paper_trading.min_profit_factor_liveHistorical (OOS) profit-factor floor for live.1.5
paper_trading.pf_position_reduction_thresholdBelow this profit factor, a strategy is admitted at half size.2.0
paper_trading.max_oos_is_ratioOut-of-sample Sharpe may not exceed in-sample by more than this multiple.1.5
paper_trading.live_strict_robustness_enabledRe-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.

KeyClampsDefault
safety_floors.min_tradesTrade count behind a →paper promotion.3
safety_floors.wfa_min_foldsJudgeable walk-forward folds.2
safety_floors.wfa_fold_pass_rate_minWalk-forward fold pass rate.0.20
safety_floors.param_jitter_pass_rate_minParameter-jitter pass rate.0.30
safety_floors.mc_max_dd_p95Monte-Carlo tail drawdown (a ceiling).0.50
safety_floors.live_min_closed_tradesClosed paper trades behind a →live promotion.3
safety_floors.live_max_drawdown_pctPaper 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

KeyMeaningDefault
live_graduated.allocation_schedulePerformance-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_pctSharpe degradation, over a 72-hour window, that retires a live strategy.0.30
dethrone.paper_min_soak_days / paper_max_soak_daysHow long a new paper strategy is protected from being recommended for replacement.7 / 14
dethrone.paper_min_closed_tradesAfter the minimum soak, a strategy with fewer closed trades than this stays protected until the maximum.5
testing_modeBypass 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_state holds the pause flag and the autonomy mode (manual, semi_auto, or auto).
  • Notification preferences — forven:notification_preferences routes 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:

  1. Open Settings → Lab. Pick a Pipeline stance first; it sets every gate at once.
  2. 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.
  3. Save. The value is written to forven:pipeline_thresholds.
  4. On the next load it is normalized and clamped by the safety floors.
  5. 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_MODE and FORVEN_ALLOW_MAINNET are 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.
  • 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