cc4199c79e349485d1a40bb8257dd26eacad3330
The CTE was `WITH halflives AS (SELECT profile, CASE profile ...)` with no FROM clause. Postgres rejects it with 42703 (column "profile" does not exist) on every hourly invocation, so the temporal dimension of the recommendation engine had never executed once — obsession (14d half-life) and contextual (7d) never faded. Rewritten as `WITH halflives(profile, halflife_sec) AS (VALUES ...)`, half-lives preserved exactly. One deliberate semantic change: the broken CASE had an `ELSE 30 * 86400` fallback, so an unrecognised profile would have decayed on a 30-day half-life. The VALUES join leaves unknown profiles undecayed instead. Today that is a no-op (only `forgotten`, already excluded by the WHERE), but a future profile added without a half-life will now conspicuously not decay rather than quietly decaying at an arbitrary rate. Verified against a scratch PG16 with one belief per profile aged exactly one half-life: UPDATE 2, obsession and contextual halved, forgotten and a fresh longterm untouched. Against the live DB (in a rolled-back transaction) the fix reports UPDATE 843. NOTE ON ROLLOUT: the first successful run applies ~23 days of accrued decay at once, cutting obsession beliefs to ~0.32x. That is correct behaviour, but recommendations will shift visibly. Expected, not a regression. REVIEW-2026-07-30.md finding 3. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
muzick
A high-performance, distributed music orchestration and recommendation platform.
Overview
muzick is designed to manage a local music library while providing an "infinite vibe" listening experience. It bridges the gap between a local filesystem and advanced discovery engines through a tiered recommendation architecture.
Tech Stack
Frontend
- Framework: React
- Routing: TanStack Router
- Data Fetching: TanStack Query (with Look-ahead Buffering)
- State Management: Zustand (for Session/Vibe state)
- Styling: CSS Variables (Customizable Themes)
Backend
- Runtime: Node.js / TypeScript
- Framework: Fastify
- Task Queue: BullMQ (via Redis)
- Search: Typesense
Infrastructure & Data
- Database: PostgreSQL (Source of truth for metadata, relationships, and session state)
- Cache/Queue: Redis
- Audio Analysis: Essentia (via Worker processes)
- External Metadata: MusicBrainz, Discogs, LRCLib, Cover Art Archive
Core Concepts
- The Rolling Vibe: A continuous, evolving stream of music that uses a "Rolling Window" of tracks. It interleaves owned library tracks with high-probability "probation" tracks (external discoveries).
- The Dislike Lifecycle: A multi-stage state machine that protects users from accidental deletions while ensuring the library stays clean.
- Tiered Similarity: Instant metadata-based matches, followed by deep audio-feature similarity.
Getting Started
Prerequisites
- Docker & Docker Compose
Running Locally
docker-compose up -d
Description
Languages
TypeScript
95.5%
PLpgSQL
2.4%
CSS
1.4%
JavaScript
0.4%
Dockerfile
0.2%