Skip to content

feat(config): reject OnlineContainerized with a non-Proton runner at save time (Phase 5) - #84

Merged
weter11 merged 2 commits into
mainfrom
phase5/container-mode-validation
Aug 15, 2026
Merged

feat(config): reject OnlineContainerized with a non-Proton runner at save time (Phase 5)#84
weter11 merged 2 commits into
mainfrom
phase5/container-mode-validation

Conversation

@weter11

@weter11 weter11 commented Aug 15, 2026

Copy link
Copy Markdown
Owner

Phase 5 — OnlineContainerized runner validation guard

What

Reject OnlineContainerized steam-mode config updates when the effective runner is
not a Proton compatibility tool, at save time instead of failing at launch.

  • src/config.rsvalidate_online_containerized_runner(steam_mode, forced_proton_version, global_proton_version, library_root) -> Result<(), String>.
    Mirrors resolve_effective_proton_name precedence (per-game forced_proton_version
    → global proton_version) and requires classify_runnerRunnerKind::Proton
    (a proton entry script).
  • src/ui.rs — the per-game settings save path runs the guard before persisting;
    a rejected update is not saved and the status bar shows:
    Configuration rejected: OnlineContainerized mode requires a Proton compatibility tool runner (e.g., steamflow-proton-11.0-purepe). Bare Wine runners are not supported in container mode.
  • Unit tests (src/config.rs): Proton accepted (forced + global), bare Wine
    rejected (forced + global, exact message), OfflineEmulated/Auto never blocked,
    empty forced override falls back to the global runner.
  • docs/architecture/phase5-onlinecontainerized-validation.md — guard design plus
    the Phase 5 launch-path logging facts (PROTON_LOG, debug.json precedence, runner
    matrix, P2 white-screen context).

Why

The Phase 5 Portal 2 (620) diagnostic found a config trap: the containerized launch
path runs <proton>/proton run inside the Steam Linux Runtime, which a plain Wine
runner (e.g. steamflow-runner-wine11-wow64) cannot satisfy — it fails at launch
with "OnlineContainerized requires a Proton compatibility tool". Worse, steam_mode
(user_apps.json) and the runner pin (config.json) are stored separately, so a
containerized test can silently run a different runner than the files state. The
guard makes the mismatch explicit at save time.

Phase 5 findings (documented in the skill + repo docs)

  1. PROTON_LOG only works on the proton-script path — DirectWine bare-wine runs
    produce no ~/steam-<appid>.log; wine debug goes to WINE_LOG_OUTPUT
    (logs/wine_<appid>.log).
  2. debug.json env is applied last in build_env and overrides CLI
    WINEDEBUG; the proton script also rewrites WINEDEBUG.
  3. OnlineContainerized × runner matrix — Proton runner required; bare Wine
    rejected.

Verification

  • cargo test --all-targetspasses (141 lib tests + all integration binaries).
  • cargo clippy --all-targets0 errors after fixing two pre-existing
    non_octal_unix_permissions deny-lint sites (set_mode(0)0o0,
    src/steam_client.rs) — same semantics, in a separate fix(clippy) commit.
  • My code region is rustfmt-clean (the repo has broad pre-existing fmt drift; not
    touched).

…save time

Phase 5 validation guard: OnlineContainerized runs the game through
<proton>/proton run inside the Steam Linux Runtime, which a plain Wine
runner cannot satisfy. validate_online_containerized_runner (src/config.rs)
mirrors resolve_effective_proton_name precedence (per-game forced ->
global proton_version) and requires RunnerKind::Proton; the per-game
settings save path in ui.rs refuses the update with a clear status message
instead of failing at launch. Unit tests cover Proton accepted (forced +
global), bare Wine rejected (forced + global), OfflineEmulated/Auto never
blocked, and empty-forced fallback.

docs/architecture/phase5-onlinecontainerized-validation.md: guard design +
PROTON_LOG path behavior (proton-script vs bare-wine), debug.json
precedence, OnlineContainerized x runner matrix, P2 white-screen context.
…sions)

Pre-existing deny-by-default lint on rust 1.92: two chmod-000 sites used
the decimal literal 0. 0o0 is identical in effect; fixes cargo clippy
--all-targets.
@weter11
weter11 merged commit db3733d into main Aug 15, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant