diff --git a/.planning/plans/active/009-wails-v3-migration.md b/.planning/plans/completed/009-wails-v3-migration.md
similarity index 100%
rename from .planning/plans/active/009-wails-v3-migration.md
rename to .planning/plans/completed/009-wails-v3-migration.md
diff --git a/.planning/plans/active/011-owned-artists-full-discography.md b/.planning/plans/completed/011-owned-artists-full-discography.md
similarity index 100%
rename from .planning/plans/active/011-owned-artists-full-discography.md
rename to .planning/plans/completed/011-owned-artists-full-discography.md
diff --git a/CLAUDE.md b/CLAUDE.md
index a0696bf..54fd289 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -144,7 +144,7 @@ meaningless against the seed's one empty playlist, so it builds ten
It wraps every bound Go method, so "did that refetch the library" is a
fact rather than an inference. It is not a spec and does not run in CI.
-**The cheapest tier needs none of that.** `make ui-test` runs 757
+**The cheapest tier needs none of that.** `make ui-test` runs 776
Vitest tests in a real Chromium with no Wails, no backend, no seeded
library and no virtual display, because **v3 routes every runtime call
— bindings, event emits, window, dialogs, clipboard — through one IPC
@@ -298,12 +298,15 @@ rather than renaming them.
`DB.QueryContext`/`QueryContextWith`/`QueryRow` route to a
*query-only* read pool (a second `sql.DB` over the same file), so
an `INSERT ... RETURNING` issued through one fails at runtime with
- "attempt to write a readonly database (8)". Use `ExecContext`, or
- `QueryRowWriter` when the statement really does return a row.
- Nothing caught this because `NewTestDB` shares one in-memory
- connection and leaves `readDB` nil, so `reader()` returns the
- *writer* under test. `TestNoWritesOnTheReadPool` walks the tree for
- it, in the same spirit as `TestNoDirectRuntimeEmits`.
+ "attempt to write a readonly database (8)" — which is exactly what
+ `CreateSmartPlaylist` did, meaning no smart playlist could be
+ created at all. Use `ExecContext`, or `QueryRowWriter` when the
+ statement really does return a row. Nothing caught this because
+ `NewTestDB` shares one in-memory connection and leaves `readDB`
+ nil, so `reader()` returns the *writer* under test.
+ `TestNoWritesOnTheReadPool` walks the tree for it, in the same
+ spirit as `TestNoDirectRuntimeEmits` and for the same reason — a
+ lint pass only sees one build configuration.
- **A new table has to say what kind of data it holds.**
`backend/datamap` is a catalogue of every table's Kind and
Lifetime, and `TestCatalogCoversSchema` fails on a table missing
diff --git a/frontend/src/components/library-status-indicator/library-status-indicator.ts b/frontend/src/components/library-status-indicator/library-status-indicator.ts
index d96d83f..b576c65 100644
--- a/frontend/src/components/library-status-indicator/library-status-indicator.ts
+++ b/frontend/src/components/library-status-indicator/library-status-indicator.ts
@@ -354,6 +354,25 @@ export class LibraryStatusIndicator extends LitElement {
}
const title = this.tooltip();
+ const icon = this.iconName()
+ ? html``
+ : nothing;
+
+ if (this.actionable) {
+ return html`
+
+ `;
+ }
// The ring stands in for the icon wherever the icon would go —
// including inside the button, because a partly-held album is