Autotag: strict auto-accept as a background job, and entry points from the library #90
Open
opened 2026-08-18 20:05:29 +00:00 by yonlu
·
1 comment
No Branch/Tag Specified
main
fix/146-stub-etxtbsy
fix/175-wizard-follows-the-library
fix/231-setter-rollback
fix/197-duplicate-column-label
docs/225-fixtures-wav-tags
docs/220-skill-check-scope
test/217-fixture-names-in-queue-selection
fix/216-riff-parse-allocation
fix/170-queue-header-action-names
fix/210-nav-sheet-scroll-affordance
docs/50-readme-landing-page
feat/65-art-prefetch-ahead
feat/71-more-as-a-bottom-sheet
feat/54-native-touch-feel
feat/67-entity-links-into-menus
test/196-visual-tier-gates
fix/138-ui-test-storage-leak
fix/104-wav-tags-read
fix/207-sheet-scroll-affordance
fix/204-ui-visual-update-filter
pi-agent-backlog-automation
63-touch-model-phase-2
63-android-touch-model
186-touch-targets-settings
186-touch-targets-page-header
187-seek-bar-hit-area
189-190-explore-correctness
135-android-underrun-instrumentation
51-android-small-screens
fix/171-phone-queue-scrim
fix/137-touch-only-affordances
fix/154-nested-css-check
feat/58-mini-player-progress-line
fix/66-album-page-scrolls-as-one
60-context-menu-action-sheet
64-android-system-volume
59-slim-the-mini-player
55-queue-as-a-screen
feat/57-drop-the-android-top-bar
feat/62-jobs-as-a-notification
fix/53-seek-bar-never-moves
fix/159-android-task-app-id
fix/52-android-activity-recreation-restarts-the-process
fix/150-expand-button-under-the-art
feat/42-inline-volume-and-centred-transport
fix/156-queue-selection-fixture-order
fix/151-fuse-the-scroll-guard-and-the-write
fix/43-queue-panel-selection
fix/143-top-bar-fits-its-window
feat/27-jobs-into-settings
feat/25-configurable-sidebar-tabs
feat/6-global-back-forward
fix/72-active-view-broadcast
fix/69-page-header-action-overflow
fix/quick-wins-batch
fix/118-in-library-clear
fix/61-mini-player-plain-text
fix/68-hover-affordances-pointer
fix/119-dev-headless-port
fix/130-issue-claim-user
fix/131-codegen-check-scope
feat/28-autotag-match-on-album
feat/17-demote-version-selector
feat/38-ownership-visibility
ci/115-manual-release
feat/34-icon-language
feat/7-full-tracklist-toggle
fix/16-tagwriter-totals
fix/unclaim-ca-certs
fix/unclaim-shell
ci/unclaim-on-close
docs/closing-keyword
docs/retire-stale-planning-docs
docs/issue-driven-workflow
integration/small-fixes
fix/small-issue-batch
fix/queue-toggle-state
fix/drag-count-badge
fix/album-card-year
fix/album-tracklist-heading
fix/seek-bar-clock-width
fix/explore-art-scanner-requests
chore/workflow-guardrails
v0.7.0
v0.6.0
v0.5.0
v0.4.0
v0.3.1
v0.3.0
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0
v0.0.1
v0.0.0
Labels
Clear labels
Area/Design
Area/Downloads
Area/Explore
Area/Library-UI
Area/Metadata
Area/Packaging
Area/Player
Area/Queue
Area/Settings
Area/Shell-Nav
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Platform/Android
Platform/Desktop
Breaking change that won't be backward compatible
Something is not working
Documentation changes
Improve existing functionality
New functionality
This is security issue
Issue or pull request related to testing
Priority
Critical
1
The priority is critical
Priority
High
2
The priority is high
Priority
Medium
3
The priority is medium
Priority
Low
4
The priority is low
Reviewed
Confirmed
1
Issue has been confirmed
Reviewed
Duplicate
2
This issue or pull request already exists
Reviewed
Invalid
3
Invalid issue
Reviewed
Won't Fix
3
This issue won't be fixed
Status
Blocked
1
Something is blocking this issue or pull request
Status
Need More Info
2
Feedback is required to reproduce issue or to continue work
Status
Abandoned
3
Somebody has started to work on this but abandoned work
Status
In Progress
Somebody is actively working on this right now
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Blocks
Reference: yonlu/yellowjacket#90
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The autotagger reviews one album at a time and always asks. An album whose match is unambiguous should not need a keystroke.
Phase 011 of
.planning/autotag.md, which is deleted in favour of this issue and its sibling. That document is stale in its details — it predates the beets/Picard-informed scoring overhaul that shipped (recommend.go,rank.go,mixedbag.go), which already delivered the recommendation tiers, VA handling and singleton path it listed as later work. What follows is what is actually left.The rule
An album-group qualifies for auto-accept iff: exact track-count match, every track's normalized title matches, every track's length within ±2 s, no cover-art replacement required, and no existing-MBID conflicts. The decision uses already-cached candidate data — no additional MusicBrainz calls.
recommend.goalready carries the recommendation tiers this gates on and names plan 011 in its own comment;rank.gonotes the cases that must refuse auto-accept entirely, and a 2-track folder cannot be auto-accept confident however well it scores. So the rule is largely a matter of wiring the existing tiers to a threshold, not inventing a new score.The job
Auto-accept processes all qualifying groups in the queue, emits progress, and is cancellable at any point. It is a
jobsregistration like every other long-running operation — the same reason the discography and lyrics backfills got one: a pass that rewrites files and cannot be seen or stopped is the gap this codebase has closed three times already. It runs underWithBackgroundPriorityso it cannot starve an interactive browse.Entry points
untaggedand requeues).notification-store, not a private toast — the app has one notification surface.The risk, stated plainly
Release selection can pick the wrong edition. The exact-track-count gate prevents most silent misbehaviour, but bonus-track editions and remaster reissues with matching track counts are genuine ambiguity. Manual review handles the edge cases — which is why auto-accept is strict by design, and why a slider for fuzzy auto-accept is explicitly out of scope.
Every apply rewrites a file. The first-apply irreversibility warning per library is what mitigates surprise, and it must fire for the auto-accept path too, not only the manual one.
Related
#28 wants a high-confidence match surfaced on the album/artist page. That is the same confidence signal rendered somewhere else, and the two should agree on what "high confidence" means rather than computing it twice.
Done when
A run over a well-tagged subset produces zero incorrect matches, is visible in the jobs indicator, and can be cancelled mid-run without leaving a group half-applied.
#28 is up as PR #121, and it lands the shared half this issue asked
for. Two things here rather than in the PR, since they are about this
issue's remaining work.
The confidence tier is now one name.
autotag.ConfidentTierwithautotag.Confident(rec)beside it, inrecommend.go. This issue's"the two should agree on what high confidence means rather than
computing it twice" is what it exists for, and the comment says so.
What it deliberately does not try to be is the whole of auto-accept's
test: the extra gates named above — exact track count, every normalized
title matching, ±2 s, no cover-art replacement, no MBID conflict —
cannot be expressed as a tier, so they stay this issue's to add on top.
Reading
Confident(rec)first and then applying them is the shape thatkeeps the two features honest with each other.
MatchForAlbumis a worked example of the no-extra-calls rule. Therule stated here — "uses already-cached candidate data, no additional
MusicBrainz calls" — is the same constraint the album page had, for a
different reason (its lookup fires on page open, against limiters
shared with every page the user can open). What it does:
lookupCachedCandidates(groupKey)for the durabletagging_candidatesblob,LocalTracksForGroupfor the group, thenautotag.Recommend. An unscored folder answers "nothing" rather thanscoring itself. An auto-accept pass can read exactly the same way and
skip a group the prefetch has not reached, which is also the behaviour
that keeps it cancellable and restartable without losing work.
One thing #28 could not settle and this issue will have to: it declines
to act on an album that spans more than one tagging group (a
multi-disc album is one group per disc), because a single "apply"
across several groups can half-succeed and leave a folder holding a mix
of old and new tags. Auto-accept processes groups individually, so it
does not have that problem — but "an album is done" and "a group is
done" are different statements, and the entry points this issue adds
("Autotag this album" from a right-click) are album-shaped. Worth
deciding deliberately rather than inheriting.