af7b5c95e9
Four coupled operator-asked changes to the view modal (Scribe plan #509): 1. **Autofocus tag entry on modal open** — TagAutocomplete grabs focus in onMounted/nextTick so the caret is in the input the moment the modal renders. No click needed to start typing. 2. **General suggestions expanded by default** — SuggestionsPanel's general-category group now mounts with `:default-open="true"`. Operator can collapse if too noisy, but the v1 frame shows them. 3. **Lower general threshold default 0.95 → 0.50** — MLSettings. suggestion_threshold_general default matches character. Alembic 0029 also bumps the existing singleton row's value if it's still at the old 0.95. Operator can re-tune from Settings → ML. 4. **Retire `copyright` + `artist` as ML suggestion categories** — neither feeds a Tag.kind (`artist` retired in FC-2d-vii-c, never really existed as a copyright tag-kind). They were surfaced in the suggestions pipeline + threshold settings UI but had no follow- through. Drop from SURFACED_CATEGORIES, suggestions._threshold_for, ml_admin GET/PATCH allowlist, MLSettings columns (alembic 0029 drops the two columns), frontend CATEGORY_ORDER + CATEGORY_LABELS, SuggestionsPanel.peopleCats, AliasPickerDialog kind-check, and MLThresholdSliders rows. Out of scope (intentional): `tag_kind` Postgres enum still includes `artist` for historic Tag row queryability (per the model comment); no operator pain reported, no enum-shrink needed. Tests: - test_surfaced_categories asserts {character, general}, excludes artist + copyright. - test_threshold_for_artist_is_unsurfaced extended to cover copyright. - test_get_and_patch_settings asserts new 0.50 default and the absent artist + copyright keys in the GET payload.
72 lines
2.5 KiB
Python
72 lines
2.5 KiB
Python
"""drop artist + copyright ml thresholds; lower general default to 0.50
|
|
|
|
Revision ID: 0029
|
|
Revises: 0028
|
|
Create Date: 2026-06-01
|
|
|
|
Operator-flagged 2026-06-01: the view modal's Suggestions panel hides
|
|
most general-category predictions because the default threshold is
|
|
0.95. Lowering the default to 0.50 (matches character) so general
|
|
suggestions surface more aggressively; the value remains tunable in
|
|
Settings → ML.
|
|
|
|
Same change retires two ML suggestion categories whose Tag.kind
|
|
surfaces are unused:
|
|
|
|
- `artist`: retired in FC-2d-vii-c — artist identity is acquisition-
|
|
derived (image_record.artist_id), never ML-inferred. The threshold
|
|
column was a leftover from before that retirement.
|
|
- `copyright`: retired 2026-06-01 — the app uses `fandom` for the
|
|
franchise/copyright concept (per TagsView.vue's doc comment); no
|
|
Tag rows of kind=copyright exist, and the threshold column never
|
|
fed anything user-visible.
|
|
|
|
Both columns are dropped from ml_settings; the existing row's
|
|
suggestion_threshold_general value is bumped from 0.95 to 0.50 iff
|
|
it's still at the old default, so deployed installs pick up the new
|
|
UX without overriding any operator tuning.
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
from alembic import op
|
|
from sqlalchemy import text
|
|
|
|
revision: str = "0029"
|
|
down_revision: Union[str, None] = "0028"
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
# Bump the general threshold for installs still at the old default.
|
|
op.execute(text(
|
|
"UPDATE ml_settings "
|
|
"SET suggestion_threshold_general = 0.50 "
|
|
"WHERE id = 1 AND suggestion_threshold_general = 0.95"
|
|
))
|
|
op.drop_column("ml_settings", "suggestion_threshold_artist")
|
|
op.drop_column("ml_settings", "suggestion_threshold_copyright")
|
|
|
|
|
|
def downgrade() -> None:
|
|
# Restore the columns with their prior defaults. The bump from
|
|
# 0.95 → 0.50 isn't reversible without remembering whether the
|
|
# operator had explicitly set 0.95 (unlikely — that was just the
|
|
# default) so we leave the current general value as-is.
|
|
from sqlalchemy import Column, Float
|
|
|
|
op.add_column(
|
|
"ml_settings",
|
|
Column(
|
|
"suggestion_threshold_artist",
|
|
Float, nullable=False, server_default="0.30",
|
|
),
|
|
)
|
|
op.add_column(
|
|
"ml_settings",
|
|
Column(
|
|
"suggestion_threshold_copyright",
|
|
Float, nullable=False, server_default="0.50",
|
|
),
|
|
)
|