docs: query comments say what each query selects and why, not how it came to be (#6277)
Rewrites the internal/db/queries comments to rule 32 and regenerates dbq, whose doc comments and embedded SQL carry them. The bugs behind the tiered mixes, the md5 order seed, the score bands and the round-robin arms are restated as the constraint each one enforces; counts from one library and stale cross-references are gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -20,10 +20,9 @@ UPDATE play_sessions
|
||||
)
|
||||
`
|
||||
|
||||
// #565: play_sessions.ended_at was added but never populated by any
|
||||
// writer. Close sessions whose last_event_at is older than 6h —
|
||||
// treating that as "user moved on" the same way audio_service does
|
||||
// after grace periods. Sessions with NO events (track_count = 0)
|
||||
// play_sessions.ended_at has no other writer. Close sessions whose
|
||||
// last_event_at is older than 6h — treating that as "user moved on" the
|
||||
// same way audio_service does after grace periods. Sessions with NO events (track_count = 0)
|
||||
// older than 1h are also closed (stale handshakes from clients that
|
||||
// never recorded a play). ended_at is set to last_event_at so the
|
||||
// session's duration reads naturally.
|
||||
@@ -46,12 +45,11 @@ UPDATE play_events
|
||||
AND started_at < now() - INTERVAL '24 hours'
|
||||
`
|
||||
|
||||
// Background garbage-collector / lifecycle queries. All five address
|
||||
// drift findings from the 2026-06-02 audit (Scribe parent #552):
|
||||
// #565 #566 #567 #574 #575. Sweeper runs on a long tick (default 1h)
|
||||
// Background garbage-collector / lifecycle queries: rows nothing else closes
|
||||
// or removes. Sweeper runs on a long tick (default 1h)
|
||||
// so per-query cost is amortised; each is idempotent (re-running on
|
||||
// already-closed/-deleted rows is a no-op).
|
||||
// #566: play_events rows opened more than 24h ago that never got a
|
||||
// Play_events rows opened more than 24h ago that never got a
|
||||
// play_ended. Client crashed mid-track, network dropped, etc. We
|
||||
// synthesize ended_at = started_at + duration_played_ms when present,
|
||||
// otherwise leave duration_played_ms null and stamp ended_at = now()
|
||||
@@ -72,7 +70,7 @@ DELETE FROM password_resets
|
||||
OR (used_at IS NULL AND expires_at < now() - INTERVAL '1 hour')
|
||||
`
|
||||
|
||||
// #575: password_resets accumulates expired + used rows forever. The
|
||||
// Password_resets accumulates expired + used rows forever. The
|
||||
// validation path already rejects them; this just keeps the table
|
||||
// from growing unbounded. Used rows are kept for 7 days for audit;
|
||||
// unused expired rows go immediately.
|
||||
@@ -106,7 +104,7 @@ DELETE FROM scrobble_queue
|
||||
AND enqueued_at < now() - INTERVAL '14 days'
|
||||
`
|
||||
|
||||
// #567: scrobble_queue rows that have been in status='failed' for
|
||||
// Scrobble_queue rows that have been in status='failed' for
|
||||
// more than 14 days. The worker stops retrying after maxAttempts;
|
||||
// failed rows accumulate forever otherwise. CASCADE from play_events
|
||||
// already drops the row when the underlying event is deleted, so this
|
||||
@@ -127,7 +125,7 @@ UPDATE system_playlist_runs
|
||||
AND last_run_at < now() - INTERVAL '10 minutes'
|
||||
`
|
||||
|
||||
// #574: system_playlist_runs.in_flight = true can wedge on a
|
||||
// System_playlist_runs.in_flight = true can wedge on a
|
||||
// goroutine panic between SET in_flight=true and SET in_flight=false.
|
||||
// The duplicate-prevention check refuses to start a fresh regen while
|
||||
// in_flight, so a stuck row blocks all future regens for that user.
|
||||
|
||||
Reference in New Issue
Block a user