docs: library comments say what the scanner and resolver do, not how they came to be (#6277)
release / govulncheck (push) Successful in 20s
release / web (push) Successful in 1m20s
release / go (push) Successful in 1m37s
release / integration (push) Successful in 5m15s
release / android (push) Successful in 5m26s
release / Build signed APK (releases and dev) (push) Successful in 5m45s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 16s
release / Verify release artifacts (tag releases only) (push) Skipped

Rewrites the internal/library comment blocks to rule 32. Task, milestone,
decision and rule ids are gone; the incidents behind them are restated as
the constraint they left (why a file is deleted before its row, why the
missing mark is a mark, why duplicates block on duration). Counts and
album names from one library are dropped from production comments; test
comments keep the names their fixtures use. The tagReadVersion log keeps
each version's before and after, without the measurements.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-23 12:27:34 -04:00
co-authored by Claude Opus 5.5
parent 08a2c06b85
commit 7e6228c13f
66 changed files with 578 additions and 564 deletions
+7 -6
View File
@@ -17,10 +17,9 @@ import (
//
// dhowden/tag stores comments in a map keyed by field name
// (vorbis.go: m.c[strings.ToLower(k)] = v), so each repeat overwrites the last
// and only the final value survives. On the operator's library that was 3,658
// of 4,092 FLAC files: Kupla's Life Forms declares eight genres and was stored
// as "Instrumental Hip Hop" alone (#2500). Nothing looked corrupt; the other
// seven were simply never seen by browse or the taste profile.
// and only the final value survives. An album that declares eight genres
// would be stored under the last alone; nothing would look corrupt, and the
// other seven would never be seen by browse or the taste profile.
//
// The comment block is read here directly, as the ID3v2 genre frame is in
// id3v2genre.go. Every other field still comes from dhowden/tag.
@@ -43,7 +42,8 @@ func readFLACGenreValues(rs io.ReadSeeker) ([]string, error) {
if _, err := io.ReadFull(rs, magic[:]); err != nil {
return nil, errNoGenreFrame
}
// Some taggers prepend an ID3v2 tag to a FLAC. The FLAC stream starts after it.
// Some taggers prepend an ID3v2 tag to a FLAC. The FLAC stream starts after
// it.
if string(magic[:3]) == "ID3" {
var rest [6]byte
if _, err := io.ReadFull(rs, rest[:]); err != nil {
@@ -172,7 +172,8 @@ func oggCommentGenres(packet []byte) ([]string, error) {
// vorbisCommentGenres reads a comment block (vendor string, then a count of
// length-prefixed "KEY=value" entries, little-endian lengths throughout) and
// returns the GENRE values in file order. Field names are case-insensitive by
// spec. Anything after the last entry, such as Vorbis's framing bit, is ignored.
// spec. Anything after the last entry, such as Vorbis's framing bit, is
// ignored.
func vorbisCommentGenres(b []byte) ([]string, error) {
next := func() ([]byte, bool) {
if len(b) < 4 {