Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
609e014
feat: add store filters and prepare 0.2.0 release
fraa2a Oct 10, 2026
744200a
feat: add opt-in application diagnostics and responsive layout fixes
fraa2a Oct 10, 2026
8f8c970
fix: apply Windows test manifest to logging checks
fraa2a Oct 10, 2026
68c7e5b
fix: persist readable Windows crash diagnostics
fraa2a Oct 10, 2026
733b0a5
fix: bound artwork command futures on the Windows UI stack
fraa2a Oct 11, 2026
03cbf77
docs: specify artwork priority cache and rendering behavior
fraa2a Oct 11, 2026
5909b4c
docs: plan artwork cache priority and stable rendering implementation
fraa2a Oct 11, 2026
4ffd6f9
feat: prioritize artwork work with bounded native admission
fraa2a Oct 11, 2026
f182eb7
feat: refresh cached game metadata only on page opening
fraa2a Oct 11, 2026
e7e28f9
feat: publish artwork refreshes without discarding cached images
fraa2a Oct 11, 2026
b8b2eb9
feat: retain artwork generations and promote opened game assets
fraa2a Oct 11, 2026
e18a179
fix: isolate live dialog blur from settings foreground
fraa2a Oct 11, 2026
e6357ed
fix: fade page foreground without snapshotting application chrome
fraa2a Oct 11, 2026
a45160e
fix: recover dither rendering and avoid unrelated redraws
fraa2a Oct 11, 2026
f2e1cfa
test: verify artwork priority cache lifetime and loading timings
fraa2a Oct 11, 2026
a9f3a51
fix: preserve artwork identity and cancel abandoned loading work
fraa2a Oct 11, 2026
606bfb5
test: close temporary databases before Windows fixture cleanup
fraa2a Oct 11, 2026
e647fda
test: use writable handles to age Windows cache fixtures
fraa2a Oct 11, 2026
8557317
feat: import TaxLauncher data transactionally before replacement
fraa2a Oct 11, 2026
adc4efa
Revert "feat: import TaxLauncher data transactionally before replacem…
fraa2a Oct 11, 2026
fc532ee
fix: adopt native Skia composition on Linux
fraa2a Oct 12, 2026
219ece2
fix: preserve library artwork and prioritize visible loading
fraa2a Oct 12, 2026
74edaa6
fix: drive navigation fades through paint frames
fraa2a Oct 12, 2026
690609a
fix: enforce usable window bounds and fit the title bar
fraa2a Oct 12, 2026
9217f2a
feat: scale compact windows to fit the complete interface
fraa2a Oct 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 93 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,21 @@ jobs:
- name: Test Home calendar and recent games
run: corepack pnpm test:home

- name: Test application logging and independent diagnostic toggles
run: corepack pnpm test:logging

- name: Test asynchronous stores and artwork cache
run: corepack pnpm test:regressions

- name: Test dropdowns, rendering, and shared artwork cache
run: corepack pnpm test:select && corepack pnpm test:visual && corepack pnpm test:artwork-cache
run: corepack pnpm test:select && corepack pnpm test:visual && corepack pnpm test:artwork-cache && corepack pnpm test:artwork-work && corepack pnpm test:details-cache

- name: Test source management and deep links
run: corepack pnpm test:sources

- name: Test catalog filters and store controls
run: corepack pnpm test:catalog

- name: Test library artwork on cold startup
run: corepack pnpm test:artwork

Expand Down Expand Up @@ -211,6 +217,45 @@ jobs:
LEGIO_WINDOWS_TESTS: "1"
run: 'cargo test --manifest-path src-tauri/Cargo.toml --locked --lib app_profile::tests::'

- name: Test Windows application logging
if: runner.os == 'Windows'
shell: bash
env:
LEGIO_WINDOWS_TESTS: "1"
run: 'cargo test --manifest-path src-tauri/Cargo.toml --locked --lib application_log::tests::'

- name: Test Windows artwork conversion and blur
if: runner.os == 'Windows'
shell: bash
env:
LEGIO_WINDOWS_TESTS: "1"
run: 'cargo test --manifest-path src-tauri/Cargo.toml --locked --lib image_trim::tests::'

- name: Test Windows artwork scheduling, metadata and cache publication
if: runner.os == 'Windows'
shell: bash
env:
LEGIO_WINDOWS_TESTS: "1"
run: |
cargo test --manifest-path src-tauri/Cargo.toml --locked --lib artwork_
cargo test --manifest-path src-tauri/Cargo.toml --locked --lib steam_details::tests::
cargo test --manifest-path src-tauri/Cargo.toml --locked --lib steam_assets::tests::

- name: Test release artwork command stack usage on Windows
if: runner.os == 'Windows'
shell: bash
env:
LEGIO_WINDOWS_TESTS: "1"
CARGO_PROFILE_RELEASE_DEBUG: "1"
run: 'cargo test --manifest-path src-tauri/Cargo.toml --locked --release --lib commands::tests::'

- name: Test Windows WebView diagnostics
if: runner.os == 'Windows'
shell: bash
env:
LEGIO_WINDOWS_TESTS: "1"
run: 'cargo test --manifest-path src-tauri/Cargo.toml --locked --lib webview_diagnostics::tests::'

- name: Test Windows Steam discovery
if: runner.os == 'Windows'
shell: bash
Expand Down Expand Up @@ -247,5 +292,52 @@ jobs:
run: cargo test --manifest-path src-tauri/Cargo.toml --locked --lib finalize_install::tests::recovers_after_database_commit_fails_and_database_reopens

- name: Build Tauri application
if: runner.os != 'Windows' || github.event_name != 'pull_request'
shell: bash
run: corepack pnpm tauri build --debug --no-bundle

- name: Build Windows test installer
if: runner.os == 'Windows' && github.event_name == 'pull_request'
shell: bash
env:
CARGO_PROFILE_RELEASE_DEBUG: "1"
run: 'corepack pnpm tauri build --bundles nsis --config ''{"bundle":{"createUpdaterArtifacts":false}}'''

- name: Record Windows installer checksums and revision
if: runner.os == 'Windows' && github.event_name == 'pull_request'
shell: pwsh
env:
PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
run: |
$directory = "src-tauri/target/release/bundle/nsis"
$installers = @(Get-ChildItem "$directory/*.exe")
if ($installers.Count -eq 0) { throw "Windows installer was not produced" }
$installers | ForEach-Object {
$hash = (Get-FileHash $_.FullName -Algorithm SHA256).Hash.ToLowerInvariant()
"$hash $($_.Name)"
} | Set-Content "$directory/SHA256SUMS.txt" -Encoding utf8
$builtRevision = git rev-parse HEAD
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
@("Built revision: $builtRevision", "PR head: $env:PR_HEAD_SHA", "Test installer. Updater signing is disabled; this is not a published release.") |
Set-Content "$directory/build-info.txt" -Encoding utf8

- name: Upload Windows test installer
if: runner.os == 'Windows' && github.event_name == 'pull_request'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: legio-windows-pr-${{ github.event.pull_request.number }}-${{ github.event.pull_request.head.sha }}
path: |
src-tauri/target/release/bundle/nsis/*.exe
src-tauri/target/release/bundle/nsis/SHA256SUMS.txt
src-tauri/target/release/bundle/nsis/build-info.txt
if-no-files-found: error
retention-days: 14

- name: Upload matching Windows native symbols
if: runner.os == 'Windows' && github.event_name == 'pull_request'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: legio-windows-symbols-pr-${{ github.event.pull_request.number }}-${{ github.event.pull_request.head.sha }}
path: src-tauri/target/release/legio.pdb
if-no-files-found: error
retention-days: 14
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ Get the latest version from [Releases](https://github.com/fraa2a/Legio/releases)

Steam must be installed for Steam integration and for games that require it.

Linux uses WebKitGTK's Skia compositor on runtime versions 2.54 and newer.
See [Linux rendering diagnostics and acceptance](docs/releases/0.2.0-linux-skia-test.md)
for backend verification, focused comparisons and runtime packaging limits.

Manual Proton and GE-Proton games without Online Fix use [umu-launcher](https://github.com/Open-Wine-Components/umu-launcher).
umu is a runtime dependency for these games, not for native Linux games, Wine
launches or games launched through Steam.
Expand Down
45 changes: 45 additions & 0 deletions docs/releases/0.2.0-artwork-rendering-verification.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Legio 0.2.0 artwork and rendering verification

The user approved both plans and inline execution with one independent final review. The PR remains draft until the affected Windows machine passes acceptance. No TaxLauncher migration or release merge is included.

## Independent review and corrections

The single read-only review reported no Critical or Minor findings and five Important findings. Each was accepted and addressed in one root fix pass:

1. Pin the already validated screenshot URL throughout download and publication. A controlled metadata-reordering resolver test returned screenshot B instead of the expected A before correction.
2. Treat recoverable corrupt metadata as a cache miss at the shared cache boundary and reach the existing repair path. The corrupt-cache regression failed before correction; an additional native artwork test checks that a missing header waits for metadata recovery and then displays its cached bytes.
3. Retain metadata requests per live consumer. Offscreen/unmounted rows release demand; the final consumer cancels the native request. Both a shared-consumer test and a mounted Store-row visibility test failed before correction.
4. Retain bounded recent cancellation IDs so cancellation before native registration cannot be forgotten. The cancel-before-begin test failed before correction.
5. Queue ordinary image conversion and IPC phase logs without waiting for log I/O. A subprocess holds the actual logger lock while converting and assembling artwork; it timed out before correction and completes after correction.

The reviewer could not certify Windows Dither composition, live blur correctness, native latency or artifact provenance from source and simulated graphics. The affected-machine visual and performance protocol is in `0.2.0-windows-test.md`; installer provenance is verified during artifact handoff. TaxLauncher migration and the other developer's transparency report are explicitly deferred.

## Verification

All frontend CI test scripts, Svelte/TypeScript check, ESLint, production frontend build and release-manifest test passed locally. The final full native suite passed 452 tests with zero failures; format and all-target/all-feature Clippy with warnings denied passed. CI artifact provenance is recorded in the PR after the Windows build. The first Windows CI run exposed an open SQLite handle during fixture cleanup; tests now explicitly close their temporary database connection before deleting the directory. Three pre-existing native external/local-game tests remain ignored; no new ignored regressions were introduced.

Before the final native cleanup and added integration test, the full native suite passed 451 tests with zero failures. The five original review regressions were observed failing before their corrections. No numerical performance gain or native compositor fix is claimed from mocks.

## Execution decisions

- Task 1: Ruling: use installed Node CLI directly and existing CARGO_HOME/target directory - local pnpm wrapper is unavailable - risk: equivalent tools must still match CI invocations.
- Task 3: Ruling: resolve missing store-asset metadata natively after the disk-cache lookup - a frontend metadata-first request would block an existing persistent cover on missing localized metadata - risk: native metadata dependency needs the same cancellation and stack-budget checks as assets; these are retained.
- Task 3: Ruling: update the existing 72-hour expiry regression to 119/121 hours - the approved freshness policy is five days - risk: intentional compatibility change, with exact five-day boundary covered separately.
- Task 4: Ruling: extend the visibility helper with continuous observation for Store/Library tiles - one-shot observation retained queued requests after scrolling away - risk: offscreen cold artwork consumers now unmount and resume from cache on re-entry; sidebar keeps its existing one-shot behavior.
- Task 4: Ruling: preserve frontend successful-fetch age instead of using refreshAt for retry backoff - native retry state already enforces five minutes and changing refreshAt falsifies freshness - risk: diagnostics must read retry failures separately from asset age.
- Task 5: Ruling: Run the rendering implementation before final integrated verification because existing navigation tests encode the native snapshot behavior that the approved rendering plan replaces. Timing work and all integrated checks remain required before the final review. Cost if wrong: later detection of integration failures.
- Task 5: Ruling: Keep the existing individual Tauri argument contract and narrowly allow argument-count lint on its commands and private adapters. An IPC schema change solely for lint would break the approved service interface. Factor metadata lock type into a named alias. Cost if wrong: signatures remain verbose.
- Task 5: Ruling: Add A/B/A reopening regressions to integrated verification and replace abandoned pending work. Reusing an aborted page request loses the new opening freshness check. Cost if wrong: reduced deduplication for obsolete requests, with live shared consumers still retained.
- Task 5: Ruling: Windows performance measurements remain pending the affected machine; record the exact cold/warm, logging and phase-measurement protocol in the acceptance document rather than claiming a speedup from simulated tests. Cost if wrong: a native latency bottleneck may still need a follow-up fix.
- Task 5: Ruling: Update legacy regressions to assert metadata-independent artwork keys and non-destructive ForceRefresh. The old reset and timestamp-key expectations contradict the approved cache contract. Cost if wrong: incompatible callers need explicit screenshot identity, covered by gallery/viewer tests.
- Final: Ruling: Use a FIFO queue of at most 64 native artwork log records instead of durable codec and IPC checkpoints. Blocking log I/O conflicts with the approved nonblocking artwork contract. Panic and explicit crash diagnostics retain their separate durable paths. Cost if wrong: pending image phase records may be lost on host termination; external Windows crash dumps remain necessary.
- Final: Ruling: Retain cancellation IDs for five minutes with at most 1024 entries. This bounds memory while absorbing cancellation-before-registration interleavings. Cost if wrong: a command delayed beyond five minutes or more than 1024 intervening cancellations may outlive its demand.
- Final: Ruling: Replace strict shared-Promise object identity in the old metadata regression with one underlying native fetch and equivalent results. Shared consumer cancellation requires distinct lifetime wrappers. Cost if wrong: callers depending on Promise identity must use the service result instead.
- Task 3: Ruling: Add a dedicated stateful GL test script to the existing visual CI command. The original always-success GL proxy could not validate resource generations or allocation failures. Cost if wrong: extra test maintenance.
- Task 3: Ruling: Windows compositor correctness remains pending user acceptance; this host exposes only an in-app Linux browser. Preserve the existing shaders and add lifecycle recovery, without claiming a corruption-specific diagnosis from fake GL tests. Cost if wrong: native corruption may require a further focused fix.
- Task 4: Ruling: Start the single read-only review against the committed range plus a saved working-tree diff while the corrected native test build completes. The implementation is stable, and final acceptance still requires a green full suite. Cost if wrong: a native failure requires the root fix pass before publication, with no second review.
- Final: Ruling: Windows Dither/compositor corruption and live blur visual correctness remain acceptance checks on the affected Windows/WebView2 environment. Source and mock graphics checks cannot certify native composition. Cost if wrong: the Windows graphics issue may require a follow-up fix before merge.
- Final: Ruling: Windows cold/warm latency and logging overhead remain unmeasured until the user's Windows run. The implementation establishes limits and priorities; it does not substantiate a numerical speedup. Cost if wrong: native loading may still have another bottleneck.
- Final: Ruling: Installer, matching symbols and provenance are subsequent required work and will be checked against the final PR head before handoff. Cost if wrong: stale artifacts would invalidate acceptance.
- Final: Ruling: TaxLauncher migration and the other developer's transparency issue remain deferred as the user instructed. Cost if wrong: those paths remain unsupported until their separate follow-up.
- Final: Ruling: Update the existing draft PR as already authorized and retain the checkout for Windows acceptance instead of repeating the integration-choice menu. No merge is authorized. Cost if wrong: remote draft changes are visible before acceptance but cannot trigger the versioned release.
Loading
Loading