feat(config): reject OnlineContainerized with a non-Proton runner at save time (Phase 5) - #84
Merged
Merged
Conversation
…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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Phase 5 —
OnlineContainerizedrunner validation guardWhat
Reject
OnlineContainerizedsteam-mode config updates when the effective runner isnot a Proton compatibility tool, at save time instead of failing at launch.
src/config.rs—validate_online_containerized_runner(steam_mode, forced_proton_version, global_proton_version, library_root) -> Result<(), String>.Mirrors
resolve_effective_proton_nameprecedence (per-gameforced_proton_version→ global
proton_version) and requiresclassify_runner→RunnerKind::Proton(a
protonentry 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.src/config.rs): Proton accepted (forced + global), bare Winerejected (forced + global, exact message),
OfflineEmulated/Autonever blocked,empty forced override falls back to the global runner.
docs/architecture/phase5-onlinecontainerized-validation.md— guard design plusthe 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 runinside the Steam Linux Runtime, which a plain Winerunner (e.g.
steamflow-runner-wine11-wow64) cannot satisfy — it fails at launchwith "OnlineContainerized requires a Proton compatibility tool". Worse,
steam_mode(
user_apps.json) and the runner pin (config.json) are stored separately, so acontainerized 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)
produce no
~/steam-<appid>.log; wine debug goes toWINE_LOG_OUTPUT(
logs/wine_<appid>.log).debug.jsonenv is applied last inbuild_envand overrides CLIWINEDEBUG; the proton script also rewritesWINEDEBUG.OnlineContainerized× runner matrix — Proton runner required; bare Winerejected.
Verification
cargo test --all-targets— passes (141 lib tests + all integration binaries).cargo clippy --all-targets— 0 errors after fixing two pre-existingnon_octal_unix_permissionsdeny-lint sites (set_mode(0)→0o0,src/steam_client.rs) — same semantics, in a separatefix(clippy)commit.touched).