Skip to content

fix: show Last.fm sync progress and recover missing account identity - #84

Merged
rianjs merged 3 commits into
mainfrom
fix/lastfm-sync-progress-recovery
Nov 9, 2026
Merged

rianjs merged 3 commits into
mainfrom
fix/lastfm-sync-progress-recovery

Conversation

@rianjs

@rianjs rianjs commented Nov 9, 2026 •

Copy link
Copy Markdown
Collaborator

Last.fm sync could report an account change when the Spotify identity cache was simply empty, and Preferences hid the reason behind a generic error. Recover missing identity through the shared profile client, preserve checkpoints on genuine mismatches, and release the sync runner before publishing completion.

Move manual sync into the Last.fm importer footer with checkpoint-based progress, persistent failure details, retry, and reconnect controls. Poll a lightweight native status projection without reloading review batches or making Spotify requests. Keep account state synchronized across windows, preserve intentional preferences edits, and discard stale polling responses. Record sync failures and retries in diagnostics, refresh the Bug log while open, and let it expand with the preferences window while report controls stay at the bottom.

Validation:

  • 933 workspace Rust tests passed; final Last.fm regression run: 249 passed.
  • Frontend tests (98 logic/gateway and 131 mounted/queue tests), production build, lint, Clippy, documentation, and Tauri ACL checks passed.
  • Native isolated-app checks covered light/dark themes, narrow/wide importer layouts, and preferences resizing from 680×640 to 1000×850.
  • Recovery tests verify one profile lookup restores missing identity without marking library membership complete, and a different account remains blocked with its checkpoint intact.

Live authenticated Last.fm reconciliation was not exercised against the installed account; native UI checks used an isolated app profile.

@rianjs-bot rianjs-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated PR Review

Reviewed commit: 4fcfbba311ef
Profile: codex-rianjs-bot - Posting as: rianjs-bot[bot]

Summary

Reviewer Findings
architecture:seams 0
frontend:view-state 0
rust:implementation-tests 1
security:credential-boundary 0
tauri:config-ipc 0

Approval Withheld

No blocking or major findings were reported. Approval is withheld because at least one reviewer did not complete its assigned review obligations:

  • unassigned — ⚠️ unassigned: changed files were not assigned to a selected reviewer
  • 1 file had no body inspection or relocation-impact review by any reviewer; examples: scripts/check-tauri-acl.mjs

Re-running the same review may reproduce this. Closing the gap means resolving the incomplete obligations above, either by having the assigned reviewer inspect the remaining file content or establish that a certified relocation needs no body reread after its impact was reviewed.

rust:implementation-tests (1 finding)

Minor - apps/desktop/src-tauri/src/lastfm_import/commands.rs:267

The use case already records its failure before releasing the sync runner, but this second write occurs after the runner has been released. A retry can start and clear the old problem before this write completes, allowing the previous run to publish a stale failure during or after the retry. Keep failure publication inside the runner's ownership, and handle errors that occur before claiming the runner without overwriting a newer run's status.

Reviewer Coverage

Complete coverage details are retained in the local coverage.json artifact.

  • architecture:seams — complete (broad); scope: 17 files; examples: apps/desktop/src-tauri/permissions/autogenerated/lastfm_sync_status.toml, apps/desktop/src-tauri/permissions/importer.toml, apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs; 12 omitted; body-inspected: 17 files; examples: apps/desktop/src-tauri/permissions/autogenerated/lastfm_sync_status.toml, apps/desktop/src-tauri/permissions/importer.toml, apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs; 12 omitted; skipped: none; context (not coverage): 6 files; examples: AGENTS.md, ARCHITECTURE.md, apps/desktop/src-tauri/src/lastfm_import/coordinator.rs, apps/desktop/src-tauri/src/spotify_membership.rs, docs/architecture/persistence.md; 1 omitted; constraints: Static review limited to architectural ownership, dependency direction, lifecycle, provider isolation, and abstraction scope. Tests and live authenticated reconciliation were not run.
  • frontend:view-state — complete (constrained); scope: 2 files; examples: apps/desktop/test/gateways.test.ts, apps/desktop/test/interactions.test.tsx; body-inspected: 2 files; examples: apps/desktop/test/gateways.test.ts, apps/desktop/test/interactions.test.tsx; skipped: none; context (not coverage): 5 files; examples: AGENTS.md, ARCHITECTURE.md, apps/desktop/src/LastFmSync.tsx, docs/architecture/library.md, docs/architecture/spotify.md; constraints: Review limited to the assigned test changes; implementation files were consulted for context and are outside the permitted finding scope.
  • rust:implementation-tests — complete (broad); scope: 9 files; examples: apps/desktop/src-tauri/build.rs, apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs; 4 omitted; body-inspected: 9 files; examples: apps/desktop/src-tauri/build.rs, apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs; 4 omitted; skipped: none; constraints: Review focused on the assigned Rust changes and their affected lifecycle and persistence paths; tests were not rerun.
  • security:credential-boundary — complete (constrained); scope: 1 file; examples: apps/desktop/src-tauri/src/lib.rs; body-inspected: 1 file; examples: apps/desktop/src-tauri/src/lib.rs; skipped: none; context (not coverage): 8 files; examples: apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs, apps/desktop/src-tauri/src/lastfm_import/model.rs, apps/desktop/src-tauri/src/lastfm_import/service.rs; 3 omitted; constraints: Review was limited to the assigned command registration and its credential-boundary implications; related implementation files were context only.
  • tauri:config-ipc — complete (constrained); scope: 11 files; examples: apps/desktop/src-tauri/build.rs, apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs; 6 omitted; body-inspected: 11 files; examples: apps/desktop/src-tauri/build.rs, apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs; 6 omitted; skipped: none; context (not coverage): 2 files; examples: docs/architecture/library.md, docs/tauri.md; constraints: Review was limited to the assigned Tauri configuration and IPC boundary; tests were not independently run.
  • unassigned — ⚠️ unassigned; skipped: 1 file; examples: scripts/check-tauri-acl.mjs; diagnostic: changed files were not assigned to a selected reviewer

0 PR discussion threads considered. 0 summarized; 0 resolved.


Completed in 1m 22s | gpt-6.1-sol, gpt-6.1-terra | cr 0.10.367
Field Value
Model gpt-6.1-sol, gpt-6.1-terra
Reviewers architecture:seams, frontend:view-state, rust:implementation-tests, security:credential-boundary, tauri:config-ipc
Engine codex_cli · gpt-6.1-sol, gpt-6.1-terra
Reviewed by cr · rianjs-bot[bot]
Duration 1m 22s wall · 3m 00s compute
Cost unavailable
Tokens 1.1M in / 7.1k out

Per-workstream usage

  • orchestrator-selection — gpt-6.1-terra
    • In: 18.8k
    • Out: 889
    • Cache read: 12.2k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 20s
  • architecture:seams — gpt-6.1-sol
    • In: 351.4k
    • Out: 1.7k
    • Cache read: 294.4k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 48s
  • frontend:view-state — gpt-6.1-terra
    • In: 127.1k
    • Out: 725
    • Cache read: 105.1k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 21s
  • rust:implementation-tests — gpt-6.1-terra
    • In: 146.0k
    • Out: 1.1k
    • Cache read: 119.2k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 29s
  • security:credential-boundary — gpt-6.1-terra
    • In: 254.1k
    • Out: 930
    • Cache read: 228.5k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 29s
  • tauri:config-ipc — gpt-6.1-terra
    • In: 149.4k
    • Out: 896
    • Cache read: 120.4k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 26s
  • orchestrator-rollup — gpt-6.1-terra
    • In: 40.0k
    • Out: 949
    • Cache read: 31.7k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 4s

@rianjs-bot rianjs-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated PR Review

Reviewed commit: 391029726042
Profile: codex-rianjs-bot - Posting as: rianjs-bot[bot]

Summary

Reviewer Findings
architecture:seams 0
frontend:view-state 0
rust:implementation-tests 0
security:credential-boundary 0
tauri:config-ipc 0

Approval Withheld

No blocking or major findings were reported. Approval is withheld because at least one reviewer did not complete its assigned review obligations:

  • unassigned — ⚠️ unassigned: changed files were not assigned to a selected reviewer
  • 1 file had no body inspection or relocation-impact review by any reviewer; examples: scripts/check-tauri-acl.mjs

Re-running the same review may reproduce this. Closing the gap means resolving the incomplete obligations above, either by having the assigned reviewer inspect the remaining file content or establish that a certified relocation needs no body reread after its impact was reviewed.

Reviewer Coverage

Complete coverage details are retained in the local coverage.json artifact.

  • architecture:seams — complete (constrained); scope: 17 files; examples: apps/desktop/src-tauri/permissions/autogenerated/lastfm_sync_status.toml, apps/desktop/src-tauri/permissions/importer.toml, apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs; 12 omitted; body-inspected: 17 files; examples: apps/desktop/src-tauri/permissions/autogenerated/lastfm_sync_status.toml, apps/desktop/src-tauri/permissions/importer.toml, apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs; 12 omitted; skipped: none; context (not coverage): 4 files; examples: AGENTS.md, ARCHITECTURE.md, apps/desktop/src-tauri/src/spotify_membership.rs, docs/architecture/spotify.md; constraints: Static architecture review only; implementation defects, React behavior, Tauri ACL correctness, and credential handling are outside this review. Tests and live authenticated reconciliation were not run.
  • frontend:view-state — complete (constrained); scope: 2 files; examples: apps/desktop/test/gateways.test.ts, apps/desktop/test/interactions.test.tsx; body-inspected: 2 files; examples: apps/desktop/test/gateways.test.ts, apps/desktop/test/interactions.test.tsx; skipped: none; context (not coverage): 5 files; examples: AGENTS.md, ARCHITECTURE.md, apps/desktop/src/LastFmSync.tsx, docs/architecture/library.md, docs/architecture/spotify.md; constraints: Review limited to the assigned test changes; implementation files were consulted for context and are outside the permitted finding scope.
  • rust:implementation-tests — complete (constrained); scope: 9 files; examples: apps/desktop/src-tauri/build.rs, apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs; 4 omitted; body-inspected: 9 files; examples: apps/desktop/src-tauri/build.rs, apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs; 4 omitted; skipped: none; constraints: Tests were not rerun in the read-only review environment.
  • security:credential-boundary — complete (constrained); scope: 1 file; examples: apps/desktop/src-tauri/src/lib.rs; body-inspected: 1 file; examples: apps/desktop/src-tauri/src/lib.rs; skipped: none; context (not coverage): 5 files; examples: apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs, apps/desktop/src-tauri/src/lastfm_import/model.rs, apps/desktop/src-tauri/src/lastfm_import/service.rs; constraints: Review was limited to the assigned command registration and its credential-boundary implications; related implementation files were context only.
  • tauri:config-ipc — complete (constrained); scope: 11 files; examples: apps/desktop/src-tauri/build.rs, apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs; 6 omitted; body-inspected: 11 files; examples: apps/desktop/src-tauri/build.rs, apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs; 6 omitted; skipped: none; context (not coverage): 5 files; examples: apps/desktop/src-tauri/permissions/autogenerated/lastfm_sync_status.toml, apps/desktop/src-tauri/permissions/importer.toml, apps/desktop/src/LastFmSync.tsx, docs/architecture/library.md, docs/tauri.md; constraints: Review was limited to the assigned Tauri configuration and IPC boundary; tests were not independently run.
  • unassigned — ⚠️ unassigned; skipped: 1 file; examples: scripts/check-tauri-acl.mjs; diagnostic: changed files were not assigned to a selected reviewer

0 PR discussion threads considered. 0 summarized; 0 resolved.


Completed in 54s | gpt-6.1-sol, gpt-6.1-terra | cr 0.10.367
Field Value
Model gpt-6.1-sol, gpt-6.1-terra
Reviewers architecture:seams, frontend:view-state, rust:implementation-tests, security:credential-boundary, tauri:config-ipc
Engine codex_cli · gpt-6.1-sol, gpt-6.1-terra
Reviewed by cr · rianjs-bot[bot]
Duration 54s wall · 1m 26s compute
Cost unavailable
Tokens 1.8M in / 8.8k out

Per-workstream usage

  • architecture:seams — gpt-6.1-sol
    • In: 681.8k
    • Out: 2.6k
    • Cache read: 602.4k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 28s
  • frontend:view-state — gpt-6.1-terra
    • In: 204.5k
    • Out: 1.0k
    • Cache read: 176.6k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 9s
  • rust:implementation-tests — gpt-6.1-terra
    • In: 236.2k
    • Out: 1.5k
    • Cache read: 201.1k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 12s
  • security:credential-boundary — gpt-6.1-terra
    • In: 336.7k
    • Out: 1.2k
    • Cache read: 306.3k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 12s
  • tauri:config-ipc — gpt-6.1-terra
    • In: 297.1k
    • Out: 1.5k
    • Cache read: 256.8k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 18s
  • orchestrator-rollup — gpt-6.1-terra
    • In: 62.5k
    • Out: 994
    • Cache read: 52.9k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 5s

@rianjs-bot rianjs-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated PR Review

Reviewed commit: 391029726042
Profile: codex-rianjs-bot - Posting as: rianjs-bot[bot]

Summary

Reviewer Findings
architecture:seams 0
rust:implementation-tests 0
frontend:view-state 1
tauri:config-ipc 0
verification:frontend-acl 4
security:credential-boundary 0
frontend:view-state (1 finding)

Minor - apps/desktop/test/interactions.test.tsx:3205

This test covers a retry becoming available but does not exercise a retry while the previous action’s final status request is still pending. In LastFmSync, that unguarded request can resolve after the new run’s poll and overwrite its newer progress, causing the footer to show the previous run’s page counts until another poll completes. Add a deterministic deferred-response test for this ordering and guard status updates by operation generation.

verification:frontend-acl (4 findings)

Major - apps/desktop/src/LastFmSync.tsx:18

The importer subscribes to lastfm-changed, but the native Last.fm state callback emits that event only to the main and preferences windows. If the account is connected, disconnected, or expires while the importer is open, this snapshot remains stale: the footer can keep offering sync for a disconnected account or keep offering connection after it has been completed in Preferences. Emit the payload-free invalidation to the importer as well, and cover cross-window account changes.

Minor - apps/desktop/src/LastFmImporter.tsx:1538

Connecting from the new footer can enable Last.fm scrobbling while Preferences is already open. Preferences keeps its own lastfmScrobbling draft initialized from the earlier settings snapshot, so pressing OK there can write the old disabled value back and silently turn scrobbling off again. Reconcile this setting when the connection is finished in the importer, while preserving intentional unsaved edits.

Minor - apps/desktop/src/LastFmSync.tsx:30

A transient failure of one status poll sets error, but later successful polls never clear it. Because problem takes precedence over progress and the completed state, the footer continues displaying the old error and offers retry even after the sync succeeds. Track polling errors separately and clear them on a successful poll, without erasing a genuine sync failure.

Minor - apps/desktop/src/dialogViews.tsx:226

If a diagnostics refresh fails once, a later successful refresh updates the report but never clears the load error. The Bug tab therefore continues to say diagnostics could not be loaded even while it is displaying current entries. Clear the diagnostics load error after a successful refresh, while keeping copy and email errors independent.

Reviewer Coverage

Complete coverage details are retained in the local coverage.json artifact.

  • architecture:seams — complete (broad); scope: 8 files; examples: apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs, apps/desktop/src-tauri/src/lastfm_import/model.rs; 3 omitted; body-inspected: 8 files; examples: apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs, apps/desktop/src-tauri/src/lastfm_import/model.rs; 3 omitted; skipped: none; context (not coverage): 5 files; examples: AGENTS.md, ARCHITECTURE.md, apps/desktop/src-tauri/src/spotify_membership.rs, docs/architecture/persistence.md, docs/architecture/spotify.md; constraints: Narrow static architecture review of assigned changes; Rust implementation, Tauri IPC, credential handling, and React behavior defects were outside scope. Tests and live authenticated reconciliation were not run.
  • rust:implementation-tests — complete (broad); scope: 7 files; examples: apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs, apps/desktop/src-tauri/src/lastfm_import/integration_tests.rs; 2 omitted; body-inspected: 7 files; examples: apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs, apps/desktop/src-tauri/src/lastfm_import/integration_tests.rs; 2 omitted; skipped: none; context (not coverage): 5 files; examples: ARCHITECTURE.md, apps/desktop/src-tauri/src/spotify_membership.rs, docs/architecture/library.md, docs/architecture/persistence.md, docs/architecture/spotify.md; constraints: Review limited to the assigned Rust implementation and behavioral test scope; tests were not executed.
  • frontend:view-state — complete (constrained); scope: 2 files; examples: apps/desktop/test/gateways.test.ts, apps/desktop/test/interactions.test.tsx; body-inspected: 2 files; examples: apps/desktop/test/gateways.test.ts, apps/desktop/test/interactions.test.tsx; skipped: none; context (not coverage): 4 files; examples: AGENTS.md, ARCHITECTURE.md, apps/desktop/src/LastFmSync.tsx, docs/architecture/library.md; constraints: Review findings are anchored to the assigned test files; the corresponding component is outside the assigned finding scope.
  • tauri:config-ipc — complete (constrained); scope: 11 files; examples: apps/desktop/src-tauri/build.rs, apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs; 6 omitted; body-inspected: 11 files; examples: apps/desktop/src-tauri/build.rs, apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs; 6 omitted; skipped: none; context (not coverage): 5 files; examples: apps/desktop/src-tauri/permissions/autogenerated/lastfm_sync_status.toml, apps/desktop/src-tauri/permissions/importer.toml, apps/desktop/src/lastfmGateway.ts, docs/architecture/library.md, docs/tauri.md; constraints: Review was limited to the assigned Tauri configuration and IPC boundary. Validation relied on source inspection; tests were not rerun.
  • verification:frontend-acl — complete (constrained); scope: 11 files; examples: apps/desktop/src-tauri/permissions/autogenerated/lastfm_sync_status.toml, apps/desktop/src-tauri/permissions/importer.toml, apps/desktop/src/App.css, apps/desktop/src/LastFmImporter.tsx, apps/desktop/src/LastFmSync.tsx; 6 omitted; body-inspected: 11 files; examples: apps/desktop/src-tauri/permissions/autogenerated/lastfm_sync_status.toml, apps/desktop/src-tauri/permissions/importer.toml, apps/desktop/src/App.css, apps/desktop/src/LastFmImporter.tsx, apps/desktop/src/LastFmSync.tsx; 6 omitted; skipped: none; context (not coverage): 8 files; examples: apps/desktop/src-tauri/src/diagnostics.rs, apps/desktop/src-tauri/src/lastfm.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lib.rs, apps/desktop/src-tauri/src/settings_commands.rs; 3 omitted; constraints: Output truncation prevented complete body inspection of the six skipped files; their changed hunks were inspected. Review was limited to the assigned frontend and ACL scope; native behavior was traced through relevant call sites. This focused pass covers the six files omitted from the primary review. Native resizing and authenticated Last.fm flows were not exercised.
  • security:credential-boundary — complete (constrained); scope: 1 file; examples: apps/desktop/src-tauri/src/lib.rs; body-inspected: 1 file; examples: apps/desktop/src-tauri/src/lib.rs; skipped: none; context (not coverage): 3 files; examples: apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/model.rs, apps/desktop/src-tauri/src/lastfm_import/service.rs; constraints: Review scope was limited to the assigned command registration and its credential-boundary implications.

0 PR discussion threads considered. 0 summarized; 0 resolved.


Completed in 2m 31s | gpt-6.1-sol, gpt-6.1-terra | cr 0.10.367
Field Value
Model gpt-6.1-sol, gpt-6.1-terra
Reviewers architecture:seams, rust:implementation-tests, frontend:view-state, tauri:config-ipc, verification:frontend-acl, security:credential-boundary
Engine codex_cli · gpt-6.1-sol, gpt-6.1-terra
Reviewed by cr · rianjs-bot[bot]
Duration 2m 31s wall · 4m 31s compute
Cost unavailable
Tokens 3.2M in / 12.8k out

Per-workstream usage

  • orchestrator-selection — gpt-6.1-terra
    • In: 19.1k
    • Out: 930
    • Cache read: 12.2k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 20s
  • architecture:seams — gpt-6.1-sol
    • In: 272.7k
    • Out: 1.4k
    • Cache read: 225.0k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 42s
  • rust:implementation-tests — gpt-6.1-terra
    • In: 137.5k
    • Out: 763
    • Cache read: 111.7k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 22s
  • frontend:view-state — gpt-6.1-terra
    • In: 114.9k
    • Out: 764
    • Cache read: 87.4k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 22s
  • tauri:config-ipc — gpt-6.1-terra
    • In: 196.7k
    • Out: 1.1k
    • Cache read: 166.8k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 28s
  • verification:frontend-acl — gpt-6.1-terra
    • In: 2.1M
    • Out: 6.1k
    • Cache read: 2.0M
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 1m 42s
  • security:credential-boundary — gpt-6.1-terra
    • In: 243.4k
    • Out: 636
    • Cache read: 214.8k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 23s
  • orchestrator-rollup — gpt-6.1-terra
    • In: 41.4k
    • Out: 1.1k
    • Cache read: 32.0k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 8s

Comment thread apps/desktop/src/LastFmSync.tsx Resolved
Comment thread apps/desktop/src/LastFmImporter.tsx Resolved
Comment thread apps/desktop/src/LastFmSync.tsx Resolved
Comment thread apps/desktop/src/dialogViews.tsx Resolved
Comment thread apps/desktop/test/interactions.test.tsx Resolved

@rianjs-bot rianjs-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated PR Review

Reviewed commit: 031be8c9cca0
Profile: codex-rianjs-bot - Posting as: rianjs-bot[bot]

Summary

Reviewer Findings
architecture:seams 0
rust:implementation-tests 0
frontend:view-state 0
tauri:config-ipc 0
verification:frontend-acl 0
security:credential-boundary 0

Reviewer Coverage

Complete coverage details are retained in the local coverage.json artifact.

  • architecture:seams — complete (constrained); scope: 8 files; examples: apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs, apps/desktop/src-tauri/src/lastfm_import/model.rs; 3 omitted; body-inspected: 8 files; examples: apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs, apps/desktop/src-tauri/src/lastfm_import/model.rs; 3 omitted; skipped: none; context (not coverage): 3 files; examples: AGENTS.md, ARCHITECTURE.md, apps/desktop/src-tauri/src/spotify_membership.rs; constraints: Static architecture review limited to assigned changes and their ownership, dependency, and lifecycle boundaries. Tests and live authenticated reconciliation were not run; React behavior, Tauri IPC, credential handling, and Rust implementation defects were outside scope.
  • rust:implementation-tests — complete (constrained); scope: 7 files; examples: apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs, apps/desktop/src-tauri/src/lastfm_import/integration_tests.rs; 2 omitted; body-inspected: 7 files; examples: apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs, apps/desktop/src-tauri/src/lastfm_import/integration_tests.rs; 2 omitted; skipped: none; context (not coverage): 5 files; examples: ARCHITECTURE.md, apps/desktop/src-tauri/src/spotify_membership.rs, docs/architecture/library.md, docs/architecture/persistence.md, docs/architecture/spotify.md; constraints: Review limited to the assigned Rust implementation and behavioral test scope; tests were not executed.
  • frontend:view-state — complete (constrained); scope: 2 files; examples: apps/desktop/test/gateways.test.ts, apps/desktop/test/interactions.test.tsx; body-inspected: 2 files; examples: apps/desktop/test/gateways.test.ts, apps/desktop/test/interactions.test.tsx; skipped: none; context (not coverage): 4 files; examples: AGENTS.md, ARCHITECTURE.md, apps/desktop/src/LastFmSync.tsx, docs/architecture/library.md; constraints: Review limited to the assigned test files and frontend state behavior; existing review threads were not repeated.
  • tauri:config-ipc — complete (constrained); scope: 11 files; examples: apps/desktop/src-tauri/build.rs, apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs; 6 omitted; body-inspected: 11 files; examples: apps/desktop/src-tauri/build.rs, apps/desktop/src-tauri/src/lastfm_import.rs, apps/desktop/src-tauri/src/lastfm_import/application.rs, apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/incremental.rs; 6 omitted; skipped: none; context (not coverage): 5 files; examples: apps/desktop/src-tauri/permissions/autogenerated/lastfm_sync_status.toml, apps/desktop/src-tauri/permissions/importer.toml, apps/desktop/src/lastfmGateway.ts, docs/architecture/library.md, docs/tauri.md; constraints: Review was limited to the assigned Tauri configuration and IPC boundary. Validation relied on source inspection; tests were not rerun.
  • verification:frontend-acl — complete (constrained); scope: 11 files; examples: apps/desktop/src-tauri/permissions/autogenerated/lastfm_sync_status.toml, apps/desktop/src-tauri/permissions/importer.toml, apps/desktop/src/App.css, apps/desktop/src/LastFmImporter.tsx, apps/desktop/src/LastFmSync.tsx; 6 omitted; body-inspected: 11 files; examples: apps/desktop/src-tauri/permissions/autogenerated/lastfm_sync_status.toml, apps/desktop/src-tauri/permissions/importer.toml, apps/desktop/src/App.css, apps/desktop/src/LastFmImporter.tsx, apps/desktop/src/LastFmSync.tsx; 6 omitted; skipped: none; context (not coverage): 4 files; examples: apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lib.rs, apps/desktop/src/useTauriInvalidationSnapshot.ts, apps/desktop/test/interactions.test.tsx; constraints: Native window resizing and authenticated Last.fm reconciliation were not exercised during this review.
  • security:credential-boundary — complete (constrained); scope: 1 file; examples: apps/desktop/src-tauri/src/lib.rs; body-inspected: 1 file; examples: apps/desktop/src-tauri/src/lib.rs; skipped: none; context (not coverage): 3 files; examples: apps/desktop/src-tauri/src/lastfm_import/commands.rs, apps/desktop/src-tauri/src/lastfm_import/model.rs, apps/desktop/src-tauri/src/lastfm_import/service.rs; constraints: Review scope was limited to the assigned changes and their credential-boundary implications.

0 PR discussion threads considered. 0 summarized; 0 resolved.


Completed in 55s | gpt-6.1-sol, gpt-6.1-terra | cr 0.10.367
Field Value
Model gpt-6.1-sol, gpt-6.1-terra
Reviewers architecture:seams, rust:implementation-tests, frontend:view-state, tauri:config-ipc, verification:frontend-acl, security:credential-boundary
Engine codex_cli · gpt-6.1-sol, gpt-6.1-terra
Reviewed by cr · rianjs-bot[bot]
Duration 55s wall · 1m 41s compute
Cost unavailable
Tokens 4.0M in / 12.8k out

Per-workstream usage

  • architecture:seams — gpt-6.1-sol
    • In: 486.1k
    • Out: 2.1k
    • Cache read: 421.9k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 21s
  • rust:implementation-tests — gpt-6.1-terra
    • In: 230.1k
    • Out: 1.1k
    • Cache read: 193.8k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 12s
  • frontend:view-state — gpt-6.1-terra
    • In: 265.3k
    • Out: 1.3k
    • Cache read: 222.8k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 15s
  • tauri:config-ipc — gpt-6.1-terra
    • In: 290.4k
    • Out: 1.6k
    • Cache read: 254.8k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 13s
  • verification:frontend-acl — gpt-6.1-terra
    • In: 2.3M
    • Out: 4.6k
    • Cache read: 2.1M
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 21s
  • security:credential-boundary — gpt-6.1-terra
    • In: 376.3k
    • Out: 986
    • Cache read: 342.5k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 12s
  • orchestrator-rollup — gpt-6.1-terra
    • In: 65.1k
    • Out: 1.1k
    • Cache read: 54.3k
    • Cache create: unavailable
    • Cost: unavailable
    • Duration: 4s

@rianjs
rianjs merged commit 14d2312 into main Nov 9, 2026
8 checks passed
@rianjs
rianjs deleted the fix/lastfm-sync-progress-recovery branch November 9, 2026 21:32
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