docs: server comments say what the code does, not how it came to be (#6277)

Comment blocks in cmd/minstrel and 30 smaller internal packages, rewritten
to rule 32's standard with each citation read in context: task, milestone
and rule ids go, and so do the stories they were attached to ("used to",
"Before #N", measurements from one install, quotes, pointers to Fabled
Librarian's records and to docs/superpowers files that are not in the
repo). Where a story wrapped a real constraint, the constraint stays as a
present-tense fact.

Comments that had gone stale are corrected:
- taste.Config: the tuned values are overlaid by internal/recsettings;
  it is no longer "a later follow-up".
- StorageConfig: the data dir holds art, caches and the stream secret,
  not only playlist covers.
- the Subsonic album list and getUser comments describe what they do
  today rather than a milestone that would change it.

Checked: the non-comment token stream of every changed file matches
HEAD, and gofmt -l is empty.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-23 12:15:05 -04:00
co-authored by Claude Opus 5.5
parent 9f9609591d
commit d191a28217
107 changed files with 485 additions and 597 deletions
+2 -4
View File
@@ -15,10 +15,8 @@ import (
"git.fabledsword.com/bvandeusen/minstrel/internal/mailer"
)
// The email digest (#5346). Nothing is emailed per event. Operator,
// 2026-10-08: "music and stuff coming in should land as a summary email and
// not everytime same for a approvals the emails should be grouped by a
// reasonable amount of time like an hour or so."
// The email digest. Nothing is emailed per event: a steady stream of new
// music or approvals would otherwise be a stream of emails.
//
// - EmailSummary kinds (new music) go out at most once a day, at the summary
// hour in the user's own timezone, listing everything since the last one.
+1 -1
View File
@@ -9,7 +9,7 @@ import (
"git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq"
)
// EmailSettings are the digest's two knobs, in admin Settings (rule 25).
// EmailSettings are the digest's two knobs, edited in admin Settings.
type EmailSettings struct {
// SummaryHour is the local hour (0-23, in each user's own timezone) the
// daily new-music summary goes out.
+11 -13
View File
@@ -1,17 +1,16 @@
// Package notifications is the one writer of the per-user notifications inbox
// (M489, #726). Producers across the server call Notifier.Notify; nothing else
// Package notifications is the one writer of the per-user notifications
// inbox. Producers across the server call Notifier.Notify; nothing else
// inserts into user_notifications.
//
// The event bus alone was fire-and-forget: a client that was not connected
// when a request completed, or when tracks went missing, never heard of it. A
// row here is the durable record. The bus only nudges open clients to come
// and read it.
// The event bus is fire-and-forget: a client that is not connected when a
// request completes, or when tracks go missing, never hears of it. A row here
// is the durable record. The bus only nudges open clients to come and read
// it.
package notifications
// Kind names one sort of notification. The set is CHECK-gated in migration
// 0073, swapped since by 0075 (rule 36): a new kind adds its value in a
// migration of the same change, and TestEveryKindPassesTheSchemaChecks
// fails until it does.
// Kind names one sort of notification. The set is CHECK-gated in the schema:
// a new kind adds its value (DROP + ADD of the CHECK) in a migration of the
// same change, and TestEveryKindPassesTheSchemaChecks fails until it does.
type Kind string
const (
@@ -23,9 +22,8 @@ const (
KindScanFailed Kind = "scan_failed"
KindTracksMissing Kind = "tracks_missing"
KindDuplicatesFound Kind = "duplicates_found"
// KindDuplicatesResolved: the duplicate resolver (M498) merged copies on
// its own. The operator asked for that to
// happen automatically; this is how it stays visible.
// KindDuplicatesResolved: the duplicate resolver merged copies on its
// own. This is how an automatic merge stays visible.
KindDuplicatesResolved Kind = "duplicates_resolved"
KindPlaybackErrors Kind = "playback_errors"
)
+1 -1
View File
@@ -17,7 +17,7 @@ import (
// row lands for them. It is a nudge with no content: the client fetches the
// inbox. A frame that carried the notification could not be told apart from
// a repeat after a reconnect, and a frame nobody received is then one nobody
// needed, because the client pulls on reconnect anyway (Roundtable #2535).
// needed, because the client pulls on reconnect anyway.
const EventCreated = "notification.created"
// Recipients names who an event is for.
+6 -6
View File
@@ -146,9 +146,9 @@ func TestNotify_CoalescedCountAddsUpWhileUnread_AndStartsAfreshOnceRead(t *testi
require.True(t, rows[1].ReadAt.Valid)
}
// M542: an update says more, newest names first, without arriving again. A
// moved created_at was announced again on the phone, and a cleared emailed_at
// was emailed again.
// An update says more, newest names first, without arriving again: a moved
// created_at would announce it again on the phone, and a cleared emailed_at
// would email it again.
func TestNotify_ACoalescedUpdateMergesNamesAndKeepsItsArrival(t *testing.T) {
pool := testPool(t)
q := dbq.New(pool)
@@ -238,9 +238,9 @@ func TestMarkRead_ScopedToTheOwner_AndIdempotent(t *testing.T) {
require.Zero(t, unread)
}
// Every kind the code knows must pass both CHECKs in the real schema. This is
// rule 36's guard: a kind added in Go without the migration fails here, not in
// production at INSERT time.
// Every kind the code knows must pass both CHECKs in the real schema: a kind
// added in Go without its migration fails here, not in production at INSERT
// time.
func TestEveryKindPassesTheSchemaChecks(t *testing.T) {
pool := testPool(t)
q := dbq.New(pool)
+1 -1
View File
@@ -42,7 +42,7 @@ type Payload struct {
// read.
Count int64 `json:"count,omitempty"`
// Items name what Count counts, one each, newest first: "Weezer – Buddy
// Holly". A coalesced update puts its own in front and keeps ten (M542),
// Holly". A coalesced update puts its own in front and keeps ten,
// so the body can say which, not only how many.
Items []string `json:"items,omitempty"`
// Detail is free text: scan_failed's error message. Rows from before
+1 -1
View File
@@ -45,7 +45,7 @@ func TestRender_CoalescedCountsReadNaturally(t *testing.T) {
require.Equal(t, "Some tracks went missing", Render(KindTracksMissing, []byte(`{}`)).Title)
}
// M542: a notice says which, not only how many.
// A notice says which, not only how many.
func TestRender_NamesWhatChanged(t *testing.T) {
require.Equal(t, "No longer on disk: Weezer – Buddy Holly.",
render(KindTracksMissing, Payload{Count: 1, Items: []string{"Weezer – Buddy Holly"}}).Body)