You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(version-picker): disable versions missing from RomM (#1575)
## What this is
PR 3 of #1570. Retained local ROM rows no longer masquerade as live,
selectable versions after RomM drops their ids. Availability is
recomputed whenever the Game Page lazily loads the version list; it is
never persisted.
## What changed
- The bound ROM detail request establishes whether the active id is
still available and supplies RomM's direct sibling view.
- Local members absent from that direct view are confirmed concurrently
through exact-id, single-attempt `get_rom` probes. If the bound id
itself returns 404, every other local member is probed individually.
- Only `RommNotFoundError` marks a version `vanished`; every non-404
failure fails open.
- Vanished rows remain visible with their local state, but are dimmed,
labelled `No longer available on RomM`, disabled, and excluded from
Default ranking.
- `vanished` remains separate from `switchable`, preserving
sibling-group membership semantics.
- A bound 404 returns `bound_vanished: true` without reporting RomM
offline or updating the global connection state.
- `SavesTab` excludes vanished versions from its stranded-save advice
while continuing to inspect live inactive installs.
- The deferred artwork cleanup now reports a missing/falsy ROM as
`not_found` instead of `server_unreachable`; artwork remains data-only
and is not used as liveness evidence.
The version-switch commit guard and deletion/purge behavior remain in
PRs 4 and 5.
## Safety
Liveness probes use the existing three-second `request_once` path on the
executor fan-out, so they neither retry nor block the event loop. Direct
sibling presence is a positive server statement; absence alone never
proves disappearance because sibling groups can be transitive.
A restored database or visibility change can make the same id available
again. The next list load recomputes the result and removes `vanished`
automatically.
## Docs
Updated the backend and Steam-shortcut architecture pages plus the
managing-games and save-sync user guides. Frozen ADR history remains
unchanged.
## Verification
`mise run gate` passed on the final code state:
- 6334 backend tests
- 2244 frontend tests
- Ruff and basedpyright clean
- TypeScript, ESLint, Prettier, Deno, build, size limit, import
contracts, and repository invariant checks passed
The subsequent documentation wording correction passed focused Markdown
formatting, link, whitespace, backend, frontend, and 404-classification
checks. Final review found no remaining issues.
## On-device verification
Open a Game Page whose shortcut is bound to a RomM id that was removed
while a replacement version remains in the local sibling group. The page
should render without waiting for liveness probes; the removed version
should remain visible but disabled, the live replacement should remain
selectable, and RomM must not be reported offline.
Closes part of #1570.
Copy file name to clipboardExpand all lines: docs/architecture/backend-architecture.md
+15Lines changed: 15 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -127,6 +127,21 @@ the rest are single modules. A service over ~700 LOC is the decomposition signal
127
127
| `connection.py` | ConnectionService — connection test + RomM minimum-version gate + Client API Token lifecycle (mint/establish via credentials, validate/store a user-pasted token, or exchange a short-lived pairing code for a token — the latter two for OIDC accounts; host-bound to the minting origin; see [ConnectionService notes](#connectionservice-notes)) |
128
128
| `protocols/` | Protocol interfaces grouped by concern (see [Protocol Interfaces](#protocol-interfaces)) |
129
129
130
+
#### Version-list liveness
131
+
132
+
`VersionSwitchService.get_version_list` separates retained local membership from current RomM availability. On each lazy
133
+
Game Page load, the bound detail request proves the bound id live and supplies the direct sibling ids; only non-bound
134
+
local members absent from that direct sibling view are exact-id probed through `RommRomReader.get_rom_once`, the
135
+
adapter's single-attempt short-timeout `request_once` path, concurrently on the existing executor fan-out. Only
136
+
`RommNotFoundError` produces `vanished: true`. All other probe failures and malformed/falsy responses fail open. No
137
+
result is persisted.
138
+
139
+
The response carries `vanished` on every version and `bound_vanished` even when `multi_version` is false. Retained
140
+
vanished rows remain in the payload and keep the independently-computed `switchable` membership verdict, but are
141
+
excluded from default ranking. A bound-id 404 is a successful entity verdict (`bound_vanished: true`,
142
+
`server_query_failed: false`), not a global reachability signal. Artwork and save reads do not contribute availability
143
+
evidence; `fetch_cover_base64` remains a nullable data callable.
0 commit comments