docs: plan-era "v1", "Task N" and "Phase N" wording restated as facts (#6277)
release / govulncheck (push) Successful in 25s
release / web (push) Successful in 1m21s
release / go (push) Successful in 1m47s
release / integration (push) Successful in 4m35s
release / android (push) Successful in 7m5s
release / Build signed APK (releases and dev) (push) Successful in 7m16s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 1m1s
release / Verify release artifacts (tag releases only) (push) Skipped

The marker list behind the earlier server and web passes did not catch
"for v1", "Task 5", "Phase 2" or "today: Flutter". Those comments now say
what the code does.

Corrected: coverart said "both v1 providers" ship on. There are four
providers (MBCAA, TheAudioDB, Deezer, Last.fm), and Last.fm, which needs a
key, ships off.

Non-comment tokens unchanged against HEAD: 10 Go files, 7 TS/Svelte files.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-23 13:05:03 -04:00
co-authored by Claude Opus 5.5
parent c96231106f
commit 466912e202
17 changed files with 31 additions and 32 deletions
+4 -5
View File
@@ -41,9 +41,8 @@ func TestLibrarySync_AfterArtistUpsert_ReturnsHydratedPayload(t *testing.T) {
truncateLibrary(t, pool)
u := seedUser(t, pool, "alice", "x", false)
// Seed an artist + write a change row in the same tx — that's the
// invariant the scanner wiring (Task 5) will enforce, and the
// handler relies on.
// Seed an artist + write a change row in the same tx — the invariant
// library writes keep, and the handler relies on.
ctx := context.Background()
tx, err := pool.Begin(ctx)
if err != nil {
@@ -122,8 +121,8 @@ func TestLibrarySync_DeleteIsReflected(t *testing.T) {
u := seedUser(t, pool, "alice", "x", false)
// Just write a delete change row directly (no underlying mutation).
// Scanner wiring (Task 5) is what couples real deletes to LogChange;
// here we test the handler reflects what's in the log.
// Library writes couple real deletes to LogChange; here we test the
// handler reflects what's in the log.
ctx := context.Background()
tx, _ := pool.Begin(ctx)
_ = sync.LogChange(ctx, tx, sync.EntityArtist, "deadbeef-dead-beef-dead-beefdeadbeef", sync.OpDelete)
+1 -1
View File
@@ -23,7 +23,7 @@ type updateProfileReq struct {
// nil = leave unchanged; non-nil empty string = clear; non-nil
// non-empty = update to that value. Note: distinguishing
// omit-vs-clear at JSON-decode time requires custom unmarshaling
// or a sentinel; for v1 we use the simpler "empty string clears"
// or a sentinel; we use the simpler "empty string clears"
// semantics: any field present in the JSON body is applied.
DisplayName *string `json:"display_name"`
Email *string `json:"email"`