kami cc4199c79e fix: repair decayBeliefs CTE so belief decay actually runs
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>
2026-07-30 23:39:24 +04:00

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
S
Description
No description provided
Readme 2.7 MiB
Languages
TypeScript 95.5%
PLpgSQL 2.4%
CSS 1.4%
JavaScript 0.4%
Dockerfile 0.2%