Troubleshooting
Symptom, cause and fix for the failures Vike Trader reports, sectioned by component and each fix naming the module that owns it.
Every entry is symptom → cause → fix, the symptom quoted as it appears in the log or on screen.
Two rules explain most of them. Absent credentials are the live gate: a venue with no keys
stays paper, silently, by design. And every misconfiguration splits two ways — refuse when a
silent difference would leave you believing a protection is armed when it is not (a ceiling, an
arming flag), degrade when "unconfigured" is a state you may have chosen (a venue connection, a
feed, a credential set). vike-cli config check states that rule and applies it finding by finding,
one exit code for the lot (crates/vike-cli/src/cmd/config_check.rs). Every refusal fires before
any venue is mounted; a degrade may only reduce the program's authority, never redirect it.
Read the startup disclosure first
vike-desktop, vike-tradehub and vike-recorder print what they resolved once a subscriber exists
(crates/vike-config/src/boot.rs's boot_lines): the settings directory, one line per settings
file, every policy.* ceiling, and whether a credential store was found beside them — by presence,
never by contents. Most "why is it paper" questions are answered there; vike-cli config show
prints the rest.
Install
version 'GLIBC_2.39' not foundat exec (Linux). The release binaries are glibc-dynamic on the release runner, measured at 2.39, and an older host fails at exec rather than at build (deploy/docker/Dockerfile's base-image note). Fix: a host at 2.39 or newer, or the container.status=203/EXECfrom systemd. The unit'sExecStartPre=runsbin/vike-cli config check, so the daemon needs that second binary beside it (deploy/vike-datahub.service).status=226from systemd. The system manager refuses a unit whoseReadWritePaths=names a missing path —<project>/settings/state. A--usermanager does not refuse, so a clean--userstart proves nothing. Fix: create the directory.- Container: every venue on paper, no error. Docker's default working directory is
/and an unmounted/projectis an empty directory, so the settings walk finds nothing;deploy/docker/entrypoint.shrefuses this and names the-vflag. From Git Bash on Windows, MSYS path conversion rewrites the container side of-v C:\vike-trader:/projectto…:C:/Program Files/Git/project. Fix: PowerShell or WSL, orMSYS_NO_PATHCONV=1. - Dukascopy:
bridge jar not found, venue on paper. The sidecar jar is a release asset.crates/bridges/dukascopy/src/config.rs'sresolve_dukascopy_toolslooks atJFOREX_BRIDGE_JAR(blank is ignored), then<project>/bin/jforex/jforex-bridge.jar; the JVM isJAVA_HOME/bin/javawhen that file exists, else<project>/bin/jre/*/bin/java, elsejavafromPATH. Fix:crates/bridges/dukascopy/scripts/provision-jforex.sh(provision-jforex.ps1on Windows), which supplies both the runtime and the jar, or pointJFOREX_BRIDGE_JARat any copy. An instantlogin failedafterwards is a corrupted platform cache, not a credential problem — delete%LOCALAPPDATA%\JForexand retry.
Credentials and arming
No project above the working directory is silent
"There are no settings here" and "the settings here say nothing" are indistinguishable downstream,
so a daemon that resolved no project loads no policy, no config and no credentials and trades every
venue on paper with no error — the incident vike_boot's module header is made of.
- Every venue on paper; the log sits beside the executable; the store line says
rung=user-dir. No project marker above the working directory. The walk (crates/vike-model/src/state_path.rs'sproject_settings_dir) takes the outermostCargo.tomldeclaring[workspace], else the nearestCargo.tomlorsettings/directory; the probe isis_dir, so creating<project>/settings/is the whole fix.VIKE_SETTINGS_DIRnames it outright and beats the walk. credential store could not be opened, continuing with NO credentials (every venue stays paper). The store exists and is unreadable — an error, where an absent store is the ordinary silent state (crates/vike-secrets/src/store.rs'sresolve). Fix: the file's permissions;vike-cli secrets pathprints the one location consulted.… holds live venue credentials in PLAINTEXT and is readable beyond its owner (mode 0644). A finding, not a refusal; the credentials load anyway. Fix: thechmod 600the line prints.<project>/.env is present but the credential store <project>/settings/secrets.env is NOT. Nothing reads a project-root.envsince credentials moved into the settings directory (LegacyStoreWarning). Fix: copy the venue keys into the store.- "I have credentials and the venue is still paper." The ceiling refused:
ARMING CEILING: <venue> has live credentials, and this deployment's ceiling for it is paper → staying PAPER(crates/vike-mount/src/paper_fallback.rs'sreport_capped_to_paper). Credentials and no[venues]table gets oneARMING CEILING NOW IN FORCEblock per process listing every affected venue; writing the table at all silences it, and a ceiling can only refuse —livedoes not put a venue live. See Risk and arming andpolicy.toml. - The Data Manager's Venues rows name a block. A row is one venue account — a box with no
[accounts]table gets exactly one per roster venue, the default account's — and itsArmingBlocknames its own fix.Disarmed(the ceiling),NoCredentials(the Connections tab),LiveCredentialsAbsent(the store holds demo-tier keys only),MainnetSwitchUnset(aliveceiling still resolves demo without{VENUE}_MAINNET),FeatureAbsent(this binary has no arm for ibkr/polymarket/fxcm),SdkAbsent(FXCM, below),ExecFlagUnset(POLY_EXEC=1),NoMountInThisBuild(the desktop, which mounts no venue),NoLiveArm(dukascopy, whose exec factory is mounted in no build, so it can only ever be paper),DemoOnlyArm/LiveOnlyArm(the arm has no such tier — ademoceiling over polymarket resolves paper), and, on a labelled second account,AccountNotNamed(nopolicy.accounts.<venue>.<LABEL>line of its own) orNoAccountSupport(that venue's arm cannot address a second account at all).ArmingBlock::ALL(crates/vike-config/src/venue_arming.rs) is the whole vocabulary. vike-desktopexits with code 2 before a window appears; the daemon prints the same message and stops. Three refusals, invike_boot::boot's order: a removed variable is set (VIKE_MAX_ORDER_NOTIONALorVIKE_TRADEHUB_MAX_ORDER_NOTIONAL→max_notional_per_orderinpolicy.toml;VIKE_SECRETS_PASSPHRASE, which nothing consumes —crates/vike-config/src/removed.rs'sREMOVED_ENV; an empty value does not count); a{VENUE}_MAINNET=1line insidesecrets.env(crates/vike-config/src/arming.rs— move it to the process environment); or a settings file that exists and is broken. See Environment variables.refusing LIVE mount: no project settings dir resolved. A live-armed venue with no project has nowhere to keep its live-account sentinel, socrates/vike-desktop/src/main.rsrefuses rather than mounting unguarded. Fix:VIKE_SETTINGS_DIR, or run inside the project.tradehub observe auth denied: bad macon a loop. The client had no key and signed with an empty one;crates/vike-app-core/src/backend_conn.rsnow logsno observe key: VIKE_TRADEHUB_OBSERVE_KEY is absent from the credentials mapfirst. The key comes from the store; an environment value fills it only when the store has none (backend_registry.rs'sfill_node_keys_from_env) and the control key is never filled. It must match the daemon's byte for byte. Daemon side,observe server NOT startednames its cause: no observe key in the store, or a non-loopbacktradehub_addr— keep it on127.0.0.1behind an SSH tunnel, or settradehub_allow_public_bind = trueinflags.toml(crates/vike-tradehub/src/tradehub_cli.rs). See Observe mode.
Feeds
- The chart stays empty after picking a symbol. The node carries live clients for six
venues while the picker searches a twelve-venue catalog, so an alpaca, oanda, dukascopy, fxcm or
ctrader instrument lands on a venue with no bar feed (
crates/vike-app-core/src/feed_lifecycle.rs). Fix: the same instrument on a venue with a feed. - The picker shows only the built-in quick-picks. The catalog has not loaded or the fetch
failed;
crates/vike-desktop/src/chart_window.rsfalls back toSYMS, Binance symbols, and choosing one resets the venue to Binance. reconcile leg suppressed: venue health probe reports Degraded. That venue's feed is mid-gap or the network is down; its reconcile leg is deferred and other venues are unaffected (crates/vike-core/src/recon_manager.rs'sshould_reconcile). Nothing to fix.- Polymarket dials fail at the SOCKS connect. The proxy is on by default at
socks5h://127.0.0.1:1080(crates/bridges/polymarket/src/egress.rs'sproxy_url). Fix:POLY_PROXY_ENABLED=falseif you are not geo-blocked,POLY_PROXY_HOST/POLY_PROXY_PORT, or a fullPOLY_SOCKS_PROXY; keepsocks5h, since plainsocks5resolves DNS locally and hits the block. The venue geo-blocks order placement only — a submit is the one call that returns 403 — and the live mount probes that first and refuses on a positive answer (crates/bridges/polymarket/src/egress.rs'scheck_order_placement_geo, decided bycrates/bridges/polymarket/src/mount.rs'sgeoblock_action).
Mounts
- cTrader or IBKR on paper after a startup outage. Their handshakes are blocking and fallible
at mount, and a failure demotes the venue to paper for the whole session with no in-thread
reconnect (
crates/vike-mount/src/lib.rs's("ctrader", _)and("ibkr", _)arms). Fix: restart once the gateway answers. A cold-startCH_ACCESS_TOKEN_INVALIDwith a valid-looking pair on disk means a rotated refresh token was never written back to the store. - FXCM mounts paper whatever the store says.
vike_fxcm::sdk_linked()iscfg!(fcsdk), set only whenbuild.rsfound the ForexConnect SDK; no CI build has ever linked it.spawnis infallible, so there is no connect result to demote on: a bad password, an unreachable gateway and a stub build are indistinguishable from outside. The stub is the only one this arm can catch — it refuses out loud and lands on paper. A live-but-failing login mounts "live" and trades nothing, and reconcile is what notices. polymarket: POLY_RECONCILE=1 without a live exec mount → RECONCILE-ONLY (exec is PAPER).
Run a recon-only Polymarket mount under quarantine
PositionDrift is the one divergence kind hybrid auto-applies, and against a paper engine it
imports the live account's position into the paper books at the venue's average price. Set
VIKE_RECONCILE_POLICY=quarantine, or arm POLY_EXEC=1 so both sides are the same account.
crates/bridges/polymarket/src/recon_client.rs's poly_reconcile_enabled carries the argument,
kind by kind.
- New orders come back rejected; cancels and reduce-only exits still work. The HALT sentinel
exists: a risk-OPENING submit is refused with a synthesized terminal
OrderRejectedwhile under the default policy areduce_onlyone is admitted (and logged), a modify is dropped, and cancel is never gated (crates/vike-bridge-core/src/exec_actor.rs,crates/vike-exec/src/halt.rs'shalt_admits_submit). The path isVIKE_HALT_FILE, else<project>/settings/state/HALT, else<exe_dir>/HALTas a reported last resort (crates/vike-bridge-core/src/halt.rs). See Halt and Stop, liquidate, restart. - BUY/SELL greyed out; the status line reads
CORE FAULT: <fault>. A handler panicked. The core neither dies nor keeps trading: it enters safe-state — trading stateHalted, working orders get a best-effort cancel, and the engine is never traded on again until the process restarts (crates/vike-core/src/runtime/mod.rs). The fault is what the GUI reads:crates/vike-app-core/src/core_sync.rswrites the status line fromsnap.fault, the trade tool's header repeats it as⚠ <fault>, and the buttons arm onsnap.fault.is_none()(crates/vike-app-core/src/tool_views/trade.rs) — not on the trading state. Fix: restart, then read the fault.
The store and the logs
- A run reports zero rows; "my tape is empty". The store resolved on a different rung than you
assumed. Precedence (
crates/vike-model/src/store_path.rs):--store/ a profile'sstore =, thenVIKE_HIST_STORE— which also overridesconfig.toml'sstore_root— then the projectVIKE_SETTINGS_DIRdeclares, then the source checkout that built the binary, then the discovered project, then the per-user directory. The startup line carriesrung=and a sentence saying why. See The history store. - The JSON log grows without bound. The file layer defaults to
traceandRUST_LOG/VIKE_LOGfilter the console only; one hour of a backfill measured 6.4 GB. Fix:VIKE_LOG_FILE_LEVEL=warnoroff(crates/vike-log/src/lib.rs'sfile_level_directive). Retention keepsDEFAULT_MAX_LOG_FILESdaily files, three, and cannot help when one day is the file — a desktop client measured 5.8 GB in 4h10m before the per-framewgpu_core,wgpu_hal,nagaandeframe::nativetargets were pinned toinfo. - The log lands beside the executable.
resolve_log_dirisVIKE_LOG_DIR, thenconfig.log_dir, then<project>/settings/state/logs, then<exe_dir>/logs— the last resort means no project resolved, the same cause as the paper-everywhere entry above.
The GUI
- Empty boxes where the window controls should be (Linux, the container). egui's bundled face
has none of
✕ ─ □ ❐ ●; the shell loads a symbol face fromcrates/vike-app-core/src/fonts.rs'sSYMBOLScandidates — Segoe UI Symbol, Noto Sans Symbols 2, DejaVu Sans — and a missing file is a silentfalse. Fix: install DejaVu or Noto Sans Symbols 2. - The saved layout did not come back.
crates/vike-app-core/src/startup.rs'srestored_workspacereturnsNoneunderVIKE_SHOT, which needs the default windows; otherwise the last named layout wins, thenworkspace.jsonunder<project>/settings/state. VIKE_SHOT=1wrote a file named1. The variable takes the output path, drops a<path>.dbgbeside it, and captures at frameVIKE_SHOT_FRAME(default 180) on a visible frame, so the window asks to be always-on-top and focused (crates/vike-desktop/src/main.rs).
Each install page's Troubleshooting block — Windows, Linux, Docker — points at the entries above that apply to it. A failure not listed here is worth a report with the startup disclosure attached.
Triage a stuck order
The core's own confirm-grace ladder, what a venue confirm can return, and which reconciliation divergence a still-missing order becomes.
Reference
One core, several front ends — how the desktop app, the daemon, the CLI and the data service relate, and where each one's flags, binaries and settings live.