This release adds 3 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
ReleasePort's take
Light signalv1.5.7 fixes silent data loss of album ratings from pre-1.5.4 versions with automated backfill and hardens error handling in rating, volume, and seek operations. Two breaking API changes require integration updates to align parameter order and null-check handling.
Why it matters: Upgrade for automatic data recovery on <1.5.4 migrations. Test integrations using setAlbumRating/getAlbumRating and IPC (albumArtist, album) order; verify settings.json sync flood (60-120 writes/sec) resolved.
Summary
AI summaryUpdates Silent-failure hardening, Patterns, and Smokes added/extended across a mixed release.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Breaking | Medium |
Breaking: setAlbumRatingScore and getAlbumRating throw on missing input Breaking: setAlbumRatingScore and getAlbumRating throw on missing input Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Breaking | Medium |
Breaking: IPC argument order aligned to (albumArtist, album) everywhere Breaking: IPC argument order aligned to (albumArtist, album) everywhere Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Breaking | Medium |
IPC argument order standardized to (albumArtist, album) across all call sites IPC argument order standardized to (albumArtist, album) across all call sites Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Feature | Medium |
Extends rating-smoke to cover album_ratings round-trip and track separation Extends rating-smoke to cover album_ratings round-trip and track separation Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
Adds __newampSmoke.analyserFftSum hook to ui-visualizer-smoke Adds __newampSmoke.analyserFftSum hook to ui-visualizer-smoke Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Bugfix | Medium |
Fixes engine.seek false-positive warnings on seekbar drag from ~30 per drag Fixes engine.seek false-positive warnings on seekbar drag from ~30 per drag Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Bugfix | Medium |
Fixes AlbumsView pendingNavigation literal missing required rating fields Fixes AlbumsView pendingNavigation literal missing required rating fields Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Bugfix | Medium |
Fixes wheel volume settings.json sync flood from 60-120 writeFileSync per second Fixes wheel volume settings.json sync flood from 60-120 writeFileSync per second Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Fixes silent data loss of pre-1.5.4 album ratings with backfill migration Fixes silent data loss of pre-1.5.4 album ratings with backfill migration Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Debounces settings.json sync writes from wheel volume changes to 250 ms trailing interval Debounces settings.json sync writes from wheel volume changes to 250 ms trailing interval Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Bugfix | Medium |
Adds one‑shot migration backfill for lost pre‑1.5.4 album ratings Adds one‑shot migration backfill for lost pre‑1.5.4 album ratings Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Refactor | Medium |
npm run typecheck runs in prebuild to prevent type errors shipping npm run typecheck runs in prebuild to prevent type errors shipping Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Refactor | Medium |
Rewrites AlbumScoreInline with loud catch and stale-resolve guards Rewrites AlbumScoreInline with loud catch and stale-resolve guards Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Refactor | Medium |
Wraps AlbumsView.setAlbumScore write in try/catch for silent failure hardening Wraps AlbumsView.setAlbumScore write in try/catch for silent failure hardening Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Refactor | Medium |
Narrows Visualizer disconnectAudio error handling to benign cases only Narrows Visualizer disconnectAudio error handling to benign cases only Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Refactor | Medium |
Introduces canonical albumKey() helper in shared/album-key.ts Introduces canonical albumKey() helper in shared/album-key.ts Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Refactor | Medium |
Documents COLLATE NOCASE ASCII-only caveat at schema and helper Documents COLLATE NOCASE ASCII-only caveat at schema and helper Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Refactor | Low |
Increases ui-visualizer-smoke fixture duration from 4.2 s to 30 s for extended coverage Increases ui-visualizer-smoke fixture duration from 4.2 s to 30 s for extended coverage Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
Full changelog
Expert-pass cleanup driven by a 10-reviewer parallel ultrareview of the 1.5.3 → 1.5.6 changeset. Five blockers, ten high-priority items, two cleanup passes — all applied and verified by smoke.
Structural fix
`npm run typecheck` runs in `prebuild`. The frontend has had zero type checking in CI since the project's start — `build:electron` only ran `tsc` against the electron tsconfig, and `build:vite` used esbuild which strips types without checking them. That's why 1.5.4 shipped an `AlbumSummary` literal missing required fields and 1.5.5 shipped despite strict-mode TypeScript. New `typecheck` script runs `tsc` against both tsconfigs; release builds now fail on type errors instead of letting them ship.
Real bugs fixed in shipped 1.5.6
- `engine.seek` false-positive warnings on every seekbar drag. The 1.5.4 diagnostic captured `target` in a closure but read `currentTime` at fire time. ~30 spurious warnings per drag. Now snapshots seekSeq + deck identity at schedule time and bails if anything changed.
- `AlbumsView` pendingNavigation literal had `undefined` rating fields. Caught by the new typecheck gate. Fix also hydrates the real album rating asynchronously.
- Wheel volume → settings.json sync writes flood. The 1.5.4 wheel-anywhere-over-viz handler made the whole canvas wheel-active; 60-120 sync `writeFileSync` calls per second on rapid scroll. Web Audio gain ramp stays synchronous; disk persist now debounces 250ms trailing.
- Pre-1.5.4 album ratings silently vanished. New one-shot backfill migration via a `library_meta` flag table.
Silent-failure hardening
- AlbumScoreInline rewritten: loud catch, write try/catch, write-generation guard for stale resolves, albumArtist fallback so empty-tag albums can be rated.
- AlbumsView.setAlbumScore write wrapped in try/catch matching the 1.5.6 read-path hardening; no more lying "Rated X 75/100" after a failed write.
- Visualizer disconnectAudio narrowed to the benign `InvalidAccessError | not connected` case; real graph corruption now logs at `console.error`.
- `setAlbumRatingScore` + `getAlbumRating` throw on missing input — caller can distinguish "successful clear" from "this call should never have been made."
Patterns
- Canonical `albumKey()` helper in `shared/album-key.ts`. Four inline rating sites collapsed to one.
- IPC argument order aligned to `(albumArtist, album)` everywhere; 7 call sites updated.
- COLLATE NOCASE ASCII-only caveat documented at schema + helper.
Smokes added/extended
- `rating-smoke` covers album_ratings round-trip (set/get/clear/NOCASE/persist), the explicit "must not touch track ratings" guarantee, `getAlbums()` after `album_ratings` rows exist (locks down the 1.5.4 LEFT JOIN ambiguous-column regression class), and throws on bad input.
- `ui-visualizer-smoke` adds FFT-sum liveness via a new `__newampSmoke.analyserFftSum` hook. Software WebGL drops shader paint so pixel deltas don't work, but the FFT path catches the load-bearing signal — if the analyser subtree is alive, FFT bytes are non-zero. Fixture extended from 4.2s to 30s.
Verification
`npm run typecheck` clean. Smoke battery green: library, album-art, keyboard, rating, visualizer, ui-visualizer, audio-limiter, replaygain, harmonic, sonic-atlas, album-random-sort, packaged-normal-launch. Windows binaries signed. SHA256SUMS + BUILD-PROVENANCE attached.
The 1.5.4 → 1.5.5 → 1.5.6 hotfix sequence happened because vite silently shipped TypeScript-invalid code, a silent `.catch(() => setAlbums([]))` made the SQL error look like "library is empty," and a smoke that asserted on a setup flag missed a broken render loop. All three failure modes now have structural prevention.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About Evilander/newamp
All releases →Related context
Related tools
Beta — feedback welcome: [email protected]