Tag-eval (heads vs centroid) + focus/provenance/layout/sticky-header fixes + tag-gaps cleanup #136

Merged
bvandeusen merged 3 commits from dev into main 2026-06-27 23:03:04 -04:00
Owner

Bundles the dev commits since the last main merge, all CI-green:

  • Tagging eval (milestone #114 slice 1)6e3c5f6 backend + 6cd7281 frontend. Admin tile (Settings → Tagging) that trains a logistic-regression head vs the old centroid on your own tags (reusing stored SigLIP embeddings), reports cross-validated AP/F1 + a learning curve + example thumbnails. Persisted in tag_eval_run (mirrors library_audit_run) so the report survives navigation. Runs on the ml queue; recovery sweep + retention + beat. scikit-learn added to the ML image.
  • Explore focus-everywhere (c8a8e23), Provenance in Explore (e34f79f), Explore page-scroll/top-gap fix (d63dfa5).
  • Sticky table headers on the Allowlist/Alias/ImportTask tables (9583783).
  • Cluster tag-gaps backend cleanup (e3855a5).

🤖 Generated with Claude Code

Bundles the dev commits since the last main merge, all CI-green: - **Tagging eval (milestone #114 slice 1)** — `6e3c5f6` backend + `6cd7281` frontend. Admin tile (Settings → Tagging) that trains a logistic-regression head vs the old centroid on your own tags (reusing stored SigLIP embeddings), reports cross-validated AP/F1 + a learning curve + example thumbnails. Persisted in `tag_eval_run` (mirrors `library_audit_run`) so the report survives navigation. Runs on the ml queue; recovery sweep + retention + beat. scikit-learn added to the ML image. - **Explore focus-everywhere** (`c8a8e23`), **Provenance in Explore** (`e34f79f`), **Explore page-scroll/top-gap fix** (`d63dfa5`). - **Sticky table headers** on the Allowlist/Alias/ImportTask tables (`9583783`). - **Cluster tag-gaps backend cleanup** (`e3855a5`). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bvandeusen added 3 commits 2026-06-27 23:02:58 -04:00
fix(settings): sticky headers on the virtual data tables
CI / lint (push) Successful in 2s
CI / frontend-build (push) Successful in 20s
CI / backend-lint-and-test (push) Successful in 28s
CI / integration (push) Successful in 3m27s
958378312c
Allowlist / Alias / ImportTask tables scroll their bodies (height=360/480) but
the column headers scrolled away with the rows, so you lost the column labels
(operator-flagged 2026-06-27). Add Vuetify `fixed-header` so the header row
stays pinned while the body scrolls.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(ml): tag-eval backend — head-vs-centroid learning-curve eval (persisted)
CI / lint (push) Successful in 3s
CI / frontend-build (push) Successful in 20s
CI / backend-lint-and-test (push) Successful in 26s
CI / integration (push) Successful in 3m23s
6e3c5f697f
Slice 1 of milestone #114 (tagging v2). Proves the frozen-embedding + trained-
head spine on the operator's own data, reusing the SigLIP embeddings already
stored on image_record — no re-embedding, no GPU.

Per concept: train a logistic-regression HEAD (positives + negatives = explicit
rejections + sampled unlabeled) vs the old single-CENTROID baseline; report
cross-validated precision/recall/AP for both, a LEARNING CURVE (AP/F1 as tagged
positives grow 10→30→100→300), and example image ids (head-would-suggest /
head-doubts-positive) to eyeball.

Persisted so the report SURVIVES navigation (operator-flagged): the run + full
report live in a new tag_eval_run row (mirrors library_audit_run); the admin
card will rehydrate from GET on mount, not transient state.

- models.TagEvalRun + migration 0056; runs on the ml queue (only worker with
  numpy/sklearn) — numpy/sklearn lazy-imported so the API can still enqueue.
- services/ml/tag_eval (compute + start helper, one-running guard), tasks.ml
  .tag_eval_run, api/tag-eval (POST create, GET history light / detail w/ report).
- recover_stalled_tag_eval_runs sweep + retention (keep last 20) + 5-min beat
  (rule 89). scikit-learn added to requirements-ml.
- tests: param normalization + the rehydrate read-path + create/conflict.

Frontend admin card (trigger + render persisted report) follows next.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(settings): tag-eval admin card — trigger + persisted report (survives nav)
CI / lint (push) Successful in 2s
CI / frontend-build (push) Successful in 17s
CI / backend-lint-and-test (push) Successful in 26s
CI / integration (push) Successful in 3m19s
6cd7281af5
Frontend for #1130. A maintenance tile in Settings → Tagging:
- Editable concept list + "Run eval" → POST /api/tag-eval (one running at a time).
- Rehydrates on mount via the persisted run (getRun by latest id) and polls while
  running — so the report SURVIVES navigation (operator-flagged); the task runs
  backend-side regardless and the card reconnects to its row.
- Renders the saved report: per-concept head-vs-centroid metrics table (AP/F1/
  precision/recall) with Δ AP, the learning curve (AP @ N positives), and
  thumbnail galleries (head-would-suggest / head-doubts-positive) for eyeballing.

Backend: _examples now stores thumbnail_urls (not just ids) so the report is a
self-contained artifact that renders without per-id lookups on reload.

No new top-level surface — slots into the existing maintenance area.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
bvandeusen merged commit 825e6b90bf into main 2026-06-27 23:03:04 -04:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bvandeusen/FabledCurator#136