Five commits from dev. CI is green on the head commit 37d3a5bc (run 8701).
Library
#2500: FLAC, Ogg Vorbis, Opus and MP4 files now keep every genre they declare. dhowden/tag kept only the last of a repeated field. On the operator's library, 3,658 of 4,092 FLACs carry more than one genre. tagReadVersion goes 3 → 4, so the startup scan re-reads tags on files already indexed. Unchanged files keep their duration and fingerprint, so the scan costs tag reads only. Expect noticeably higher genre counts in browse.
Recommendations
#2701: For You's liked-track seeds and the Songs-like fallback seed now skip tracks whose files are missing.
Web
#3150: text on a tint of its own hue uses the house -fg tokens. That is 23 sites, including the player bar's active buttons, the admin count pills, the status pills and the accent chips. Worst-case contrast goes from about 2:1 to 4.75–5.03:1.
#3150: error text uses error-fg on every surface (19 sites), going from 2.64–3.63:1 to at least 5.30:1. A CI check now fails on any new hue-on-own-tint text and on raw error text.
#3943: the web tests stub SvelteKit's $app modules suite-wide, which removes the __SVELTEKIT_PAYLOAD__ module-load flake.
Five commits from `dev`. CI is green on the head commit 37d3a5bc (run 8701).
**Library**
- **#2500:** FLAC, Ogg Vorbis, Opus and MP4 files now keep every genre they declare. dhowden/tag kept only the last of a repeated field. On the operator's library, 3,658 of 4,092 FLACs carry more than one genre. `tagReadVersion` goes 3 → 4, so the startup scan re-reads tags on files already indexed. Unchanged files keep their duration and fingerprint, so the scan costs tag reads only. Expect noticeably higher genre counts in browse.
**Recommendations**
- **#2701:** For You's liked-track seeds and the Songs-like fallback seed now skip tracks whose files are missing.
**Web**
- **#3150:** text on a tint of its own hue uses the house `-fg` tokens. That is 23 sites, including the player bar's active buttons, the admin count pills, the status pills and the accent chips. Worst-case contrast goes from about 2:1 to 4.75–5.03:1.
- **#3150:** error text uses `error-fg` on every surface (19 sites), going from 2.64–3.63:1 to at least 5.30:1. A CI check now fails on any new hue-on-own-tint text and on raw error text.
- **#3943:** the web tests stub SvelteKit's `$app` modules suite-wide, which removes the `__SVELTEKIT_PAYLOAD__` module-load flake.
No migrations.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
The home page reaches the real $app/navigation through AlbumCard and
AlbumMenu. That loads SvelteKit's client runtime, whose $app/paths reads
__SVELTEKIT_PAYLOAD__ at module load. The global is only there when the
kit plugin's define reaches the module, and under vitest that is not
reliable: page.test.ts failed to load on CI run 6576 and passed on its
re-run. #374 was the same class of failure.
vitest.setup.ts now mocks $app/navigation, $app/state and $app/paths for
every test. Per-file mocks still win. A small guard test fails if the
suite-wide mocks are removed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A hue painted as text on a color-mix tint of itself sits close to the
surface under it. On Minstrel's surfaces the raw accent on its 15% tint
measures 1.97:1 at worst (dark mode, hover surface), against AA's 4.5.
- tokens.json gains colors.fg: the five FabledSword -fg formulas (accent
45%, success 45%, warning, error and info 50%), each mixed toward
parchment so one declaration serves both modes. Success is Minstrel's
moss. tokens-to-css emits them in :root.
- Tailwind exposes them as text-accent-fg, text-warning-fg, text-error-fg
and text-info-fg.
- 23 sites swapped: 14 Tailwind class strings (PlayerBar and the admin
count pills) and 9 CSS rules (StatusPill's four tones and five accent
chips). Worst case after: accent-fg 5.03, error-fg 4.75, warning-fg
4.92, success-fg 4.85.
- scripts/check-tint-contrast.js finds the pair in either spelling. Its
test scans src in the web Vitest lane and fails on any new site, with
fixture cases showing it can fail.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Raw error red fails AA as text even with no tint behind it: in dark mode
it measures 3.63:1 on obsidian, 3.23 on iron and 2.64 on slate, against
4.5. error-fg (the house formula, 50% toward parchment) measures 5.30 at
worst across both modes.
- All 19 text-error uses become text-error-fg: the "Couldn't load"
messages on the admin pages, the integrations form errors, the flag
popover, and the error toast's text. The toast keeps its error border,
since a border is a graphic with a 3:1 floor.
- check-tint-contrast flags raw error text anywhere (text-error,
class:text-error, color: var(--fs-error)) and leaves borders and
outlines alone. Run against the files before the swap, it finds all 19.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PickTopPlayedTracksForUser's liked tier read general_likes without
joining tracks. With no plays to seed from, For You could pick a liked
track whose file is gone. The play tiers were already safe: their
play_events join filters missing_since.
The same gap was in PickTopPlayedTrackForArtistByUser's fallback, which
seeds Songs-like from the artist's newest album when there are no recent
plays. It could pick a missing track, and since #5296 a missing track is
never fetched for similarity, so that seed has no edges either. The
caller already skips an empty seed, so an artist whose tracks are all
missing gets no Songs-like mix instead of one aimed at nothing.
Integration tests cover both cases: a liked-but-missing track is not a
seed, and the Songs-like fallback moves to the next album once the
newest one's track goes missing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Five commits from
dev. CI is green on the head commit37d3a5bc(run 8701).Library
tagReadVersiongoes 3 → 4, so the startup scan re-reads tags on files already indexed. Unchanged files keep their duration and fingerprint, so the scan costs tag reads only. Expect noticeably higher genre counts in browse.Recommendations
Web
-fgtokens. That is 23 sites, including the player bar's active buttons, the admin count pills, the status pills and the accent chips. Worst-case contrast goes from about 2:1 to 4.75–5.03:1.error-fgon every surface (19 sites), going from 2.64–3.63:1 to at least 5.30:1. A CI check now fails on any new hue-on-own-tint text and on raw error text.$appmodules suite-wide, which removes the__SVELTEKIT_PAYLOAD__module-load flake.No migrations.
🤖 Generated with Claude Code