The research pane
The studies a user has written, the one button that runs one, and the runs that came out — one list for the interpreted and compiled tiers, and a results surface that keeps a study's numbers out of any column a backtest's could share.
crates/vike-studio/src/research.rs's header names the pane in one line: the studies a user has
written, the ONE button that runs one, and the runs that came out — the Studio's sibling of the
Sweep pane, dispatching through crates/vike-studio-core/src/study_dispatch.rs instead of the
backtest engine. It invents no second mechanism: the dispatch is a worker thread whose result
StudioState::poll folds, and the outcome lands in the same centre panel a backtest's does. What a
study is belongs to the research tree (studies,
running a study); this page is the surface.
One list for both tiers
list_studies returns the rhai tier and the rust tier as rows of one list, differing only in a
StudyTier tag, and the only match that decides how a study RUNS lives in run_study_plan. So
the pane has one list, one Run button and no second surface for either tier. The tier shows as a
badge because it is a fact a user acts on, and the hover says which: interpreted, compiled at
run time from the folder, so a shipped binary can run it; or compiled, resolved through a registry
generated at build time, so it runs only on a binary built from a checkout that held it
(Rhai studies, Rust studies).
Scanning is lazy: the first frame the tool is opened reads both listings, a session that never
opens it reads no directory at all, and ⟳ Rescan re-reads user_data/research/studies and
user_data/runs. Everything a scan could not use renders as a red row rather than an absence —
crates/vike-studio-core/src/listing.rs's rule that a run which vanishes from a list is worse than
one that shows as broken.
Where it reads from
The pane resolves no path. StudyHost — the studies root <project>/user_data/research/studies,
the runs root <project>/user_data/runs, a scratch directory, the producing binary's name and its
commit if it can name one — is set by the binary after construction, for the same reason the
store's remoteness and the backend are: a library resolves no project root.
crates/vike-desktop/src/main.rs's studio_study_host derives it from the settings directory the app
already resolved, honouring VIKE_USER_DATA_DIR outright, and records produced_by as vike-desktop
with no commit, which its doc calls the honest answer for a binary that reaches build info only
through its boot crate.
No host is the ordinary state of a binary launched from outside any project, and it is disclosed:
the pane renders NO_HOST — "No project folder above this working directory, so there is nowhere
to read studies from and nowhere to put a run. Launch the app from inside a project, or set
VIKE_SETTINGS_DIR to name one." — and lists nothing and arms nothing. A project with no studies
reads NO_STUDIES, which names the two folders a study can live in.
Recipe, window, learner
A recipe is a .toml beside the study's entry file, one named configuration, and neither runner
reads it — the caller does. The Recipe picker's index 0 is (no recipe), which runs the study
with no configuration and records that it had none; the rest are the folder's .toml files in name
order. Selecting a different study resets the picker, because recipe 2 of one study has nothing to
do with recipe 2 of another. The recipe is read when the plan is built, so a file that will not
parse is refused before dispatch, with the file named beside the picker that chose it.
Window is the picked data slice's range, or "the whole store (no data slice picked)".
StudioState::study_window's doc is careful that this is not a gate: a study reads whatever series
it likes through its own context verbs, so the window is a fact the run records and the default its
read verbs take — requiring a slice would be an invented coupling, since a backtest replays that
exact series and a study does not.
This host supplies no learner
The pane states its ceiling where a study would hit it: "This host supplies no learner: a study
that must FIT refuses with NoLearner. Inference and importance still work." The Studio's ML surface
is inference only — crates/vike-studio-core/src/lib.rs's header: it fits nothing, because no
trainer binary ships off Linux — and the plan is built with learner: None. A study that fits runs
under vike-study; training
and models cover what a learner is.
▶ Run study is enabled with a study selected and nothing running; it dispatches through
spawn_study and leaves a run behind in user_data/runs. When the run lands, only the runs list is
re-scanned — no study folder can have changed by running one.
The runs list holds no numbers
The Runs section lists every run of every kind, newest first, each with a kind badge — the
manifest's kind, the one top-level field a reader may branch on. kind_color gives three answers
on purpose: a study run in the accent colour, a backtest run in the success colour, and a kind this
build does not recognise in the warning colour under its own name, because kinds grow in crates
that cannot see each other and "I do not know this one" is an answer a reader needs. Hover shows
who produced it, when it started, and "no report on disk" when the report is missing; a footer
names which runs tree the rows are about (runs on disk).
RunRow carries no metric at all, and a test holds it there over a manifest whose metrics are
populated. The pane's own blurb: "Numbers live in the run, never in this list — a study's Sharpe
and a backtest's are not the same measurement." crates/vike-studio-core/src/study_run.rs nests a
study's metrics under detail.metrics precisely so a listing that never asked which scorer produced
a number cannot render it in a shared column.
The result surface
study_result_ui is the centre panel for one study run, and it is deliberately not the backtest
results pane: that renders an equity curve, a trade list and eleven
event-driven metrics, and a study produces none of them. It shows the run's facts — study, produced
by, started, finished, window, whether a learner was supplied, where it was saved — then a Metrics
table in which a non-finite value renders as IEEE-754's own token through nonfinite_tag rather
than as 0.00, because a NaN Sharpe over a fold that never traded is an observation the manifest
keeps; then any artifacts by name and size; and finally STUDY_METRICS_NOTE verbatim, the sentence
the library writes into every study run's manifest so that a file read alone still carries the
distinction. A study that recorded nothing says so rather than rendering a gap.
The templates gallery
Three starter Rhai strategies, each declaring its knobs with param() so it drops straight into the sweep grid — loadable blind from a dropdown, or previewed card by card in the gallery before they overwrite the editor.
Results
The tabbed pane over a backtest result — equity, trades, performance, the returns distribution, and a validation tab that combines the probabilistic Sharpe of one run with the deflated Sharpe, PBO and walk-forward consistency a sweep and a walk-forward add.