Commit Graph

181 Commits

Author SHA1 Message Date
Claudio Ortolina e67b172d64 ML-200: daily scrobble count charts 2026-05-31 21:52:06 +03:00
Claudio Ortolina b3b8f0546e ML-200: daily scrobble count charts (plan) 2026-05-31 21:23:55 +03:00
Claudio Ortolina 75e2ec5c70 ML-199: extract shared record show logic 2026-05-29 08:50:27 +03:00
Claudio Ortolina 57866f4cad ML-198: document timezone plan 2026-05-27 01:11:07 +03:00
Claudio Ortolina 19e097e514 ML-197: add Elm-style Presto application 2026-05-26 08:59:01 +03:00
Claudio Ortolina 631053b87e ML-197: track Elm-style Presto application 2026-05-26 08:45:04 +03:00
Claudio Ortolina bfcdfc1b90 ML-169.7: record audit findings 2026-05-25 12:52:01 +03:00
Claudio Ortolina a3701de90e Backlog cleanup 2026-05-25 09:33:08 +03:00
Claudio Ortolina f347f56218 ML-169.8: reduce Stats mount sync queries to 3
Move 7 non-critical queries out of synchronous mount into assign_async
and start_async tasks with skeleton loading placeholders.

Only scalar badge counters (collection count, wishlist count, scrobble
count) remain synchronous. All async sections use <.async_result> with
loading and failed slots. Scrobble activity preserves LiveView streams
via handle_async. On-this-day date changes use AsyncResult.ok/2.
2026-05-25 09:31:43 +03:00
Claudio Ortolina 5c80a6d6ad ML-169.11: archive as invalid 2026-05-23 20:23:01 +01:00
Claudio Ortolina 1ccd9ccc91 ML-182: finish audit and subsequent improvements 2026-05-23 07:18:25 +01:00
Claudio Ortolina 69245d8d15 ML-156: extend and improve plan 2026-05-22 23:46:04 +01:00
Claudio Ortolina b10be7ba3c ML-169.10: async delete actions with initial implementation 2026-05-22 16:19:54 +01:00
Claudio Ortolina 9f02e12414 ML-169.10: refine implementation plan 2026-05-22 15:37:09 +01:00
Claudio Ortolina ee4eecd1c6 ML-169.9: archive invalid stream pagination task
Pagination is page-based (not load-more), so reset: true on each
page navigation is correct. Using at: -1 would accumulate records
across pages, breaking the pagination model.
2026-05-22 15:29:07 +01:00
Claudio Ortolina 67a2e6eac6 ML-196: add application-task pi prompt template
Introduces /application-task for working on Backlog.md tasks end-to-end:
- Pre-flight: read docs, load task plan, load relevant skills
- Execution: present plan, short loops, log progress, handle scope
- Done vs Complete: finalize without archiving, per Backlog.md workflow
2026-05-22 15:17:12 +01:00
Claudio Ortolina ff3f809c2c ML-170: add enrichment fields to collection API
Add MusicLibrary.Collection.Enrichment module with batch scrobble, artist
country, and selected release enrichment from existing tables.

Wire enrichment into all four collection API endpoints (index, latest,
random, on_this_day). New JSON fields: scrobble_count, last_listened_at,
artist_country, selected_release.

Uses 3 fixed-count batch queries regardless of page size — no N+1 risk.
No schema changes or migrations required.
2026-05-22 13:21:14 +01:00
Claudio Ortolina c41299f6c1 ML-196: pi template work on application task (capture) 2026-05-22 13:18:08 +01:00
Claudio Ortolina 00864ae994 Backlog cleanup 2026-05-22 10:28:26 +01:00
Claudio Ortolina d8a67cd475 ML-181: harden assets endpoints 2026-05-22 08:20:35 +01:00
Claudio Ortolina ca01e94d47 ML-194: add selective smoke coverage
Add smoke tests for bulk cron workers, CSP browser header, and
on_mount hooks (GetTimezone/StaticAssets). 9 tests across 4 files,
all passing alongside 135 existing related tests.
2026-05-21 12:01:32 +01:00
Claudio Ortolina ec6980eea0 ML-193: add secondary parser, search, and API coverage tests
Add ~80 focused tests across 10 files covering:

- Record set search by name, description, contained record title, artist name
- Navigation events for records, artists, record sets, links, and view-all actions
- MusicBrainz.ReleaseGroup parser (artist credits, included RGs, release IDs, types)
- MusicBrainz.ReleaseSearchResult edge cases (missing RG, unknown formats)
- LastFm.Session XML edge cases (non-subscriber, missing nodes)
- MusicLibrary.HttpError default status-kind mapping
- Discogs.API.ErrorResponse fallback message and retry-delay behavior
- ArtistRefreshWikipediaData {:cancel, :no_english_wikipedia} worker path
- StatsComponents grouped on-this-day records and anniversary labels
2026-05-21 10:45:29 +01:00
Claudio Ortolina ff42f24972 ML-195: Add credo check for put_toast/put_toast! usage in live components 2026-05-21 08:08:11 +01:00
Claudio Ortolina 2983313426 ML-192: add high value missing tests
- Record editing + cover search
- Barcode scan errors + cart editing
- Notes
- Scrobble rules application over set of tracks
- Image conversion
2026-05-21 06:38:02 +01:00
Claudio Ortolina 07f43e59bb ML-192: plan refinement 2026-05-20 22:55:34 +01:00
Claudio Ortolina ab48d4b13a Add testing coverage backlog tasks 2026-05-20 18:22:08 +01:00
Claudio Ortolina 23960b5b23 ML-169.10.1: Add delete coverage
Cover current delete behavior across LiveView index and show paths, and strengthen existing delete tests with persistence assertions.\n\nValidation: mise run dev:precommit
2026-05-20 18:04:29 +01:00
Claudio Ortolina c537ea0d21 Backlog cleanup 2026-05-20 13:15:11 +01:00
Claudio Ortolina 004d2a2318 ML-169.10: refine implementation plan 2026-05-20 11:20:33 +01:00
Claudio Ortolina 760c44ccb5 ML-169.10: rescope to list pages and use async handling 2026-05-20 10:42:35 +01:00
Claudio Ortolina d2def9d0d3 ML-169.8: tighten task scope 2026-05-20 07:55:36 +01:00
Claudio Ortolina 4a6c80f7a9 ML-191: avoid VACUUM / scrobble refresh write collision
Set busy_timeout: 5_000 on MusicLibrary.Repo so SQLite waits up to
5 seconds on lock contention instead of throwing SQLITE_BUSY
immediately (default is 0).

Move RepoVacuum from 0 3 to 3 3 (3:03 AM London) to avoid the
deterministic collision with RefreshScrobbles which fires on the
every-5-min cadence at the hour mark.
2026-05-19 16:46:37 +01:00
Claudio Ortolina 78670268d5 ML-169.5: cancel task as it breaks functionality 2026-05-19 15:16:55 +01:00
Claudio Ortolina be371cbf4e ML-169.11: add correlated subquery fix task 2026-05-19 12:51:36 +01:00
Claudio Ortolina ab8062ddc6 ML-169.9: add pagination stream reset fix task 2026-05-19 12:51:29 +01:00
Claudio Ortolina e42e28992a ML-169.10: add optimistic delete UI fix task 2026-05-19 12:51:19 +01:00
Claudio Ortolina 96248231fa ML-169.7: add scrobble stream reset fix task 2026-05-19 12:51:05 +01:00
Claudio Ortolina c9f00c9360 ML-169.8: add StatsLive TTFB performance fix task 2026-05-19 12:50:56 +01:00
Claudio Ortolina e458f605c5 ML-169.6: add redundant stream reload fix task 2026-05-19 12:50:36 +01:00
Claudio Ortolina 0ec4b989c9 ML-169.5: add display toggle performance fix task 2026-05-19 12:50:09 +01:00
Claudio Ortolina f1fde63d42 ML-189: simplify release-component notifications
- Use a tagged type
- Leave skipping responsibility to subscribed process
2026-05-19 12:18:07 +01:00
Claudio Ortolina 73046bb0f5 ML-190: fix record subscription lifecycle 2026-05-19 12:10:34 +01:00
Claudio Ortolina e204e555bd ML-188: guard PubSub record updates during edit mode
Add live_action guard to handle_info({:update, record}) in both
CollectionLive.Show and WishlistLive.Show. When the user is editing,
background worker updates are skipped and a warning toast is shown
instead of overwriting the socket. Normal show-mode updates and
mismatched-ID no-ops are unchanged.

6 tests added covering all three code paths.
2026-05-19 11:38:42 +01:00
Claudio Ortolina 2fca0bb106 ML-190: fix redundant unsubscribe (plan) 2026-05-19 10:38:41 +01:00
Claudio Ortolina 0f529daa4e ML-189: fix dynamic tag type (plan) 2026-05-19 10:21:45 +01:00
Claudio Ortolina 5ee1d0b82a ML-188: race condition in background update (plan) 2026-05-19 10:03:58 +01:00
Claudio Ortolina 70dfce1346 Move audit tasks to done (should have done that earlier) 2026-05-19 09:51:14 +01:00
Claudio Ortolina 0881971635 Backlog cleanup 2026-05-19 09:48:55 +01:00
Claudio Ortolina 54b682a663 ML-190: add same-record reconnect optimization task
From audit doc-25 (Phase 2), Recommendation #2.
2026-05-19 09:46:31 +01:00
Claudio Ortolina b858c27f52 ML-189: add Release component tag type-safety task
From audit doc-24 (Phase 1), Recommendation #1.
2026-05-19 09:46:22 +01:00