Ship: system-tag refactor + soft WIP tier + Explore reach (#1464, #1474, #1476) #223

Merged
bvandeusen merged 4 commits from dev into main 2026-07-13 12:13:20 -04:00
Owner

Ships three stacked, CI-green features from dev to main. All experience-level changes best validated live.

What ships

#1464 — System-tag behavior refactor. editor screenshot moves from chrome (hidden) to the PROCESS group (shown in gallery, like wip). wip+editor gain provisional auto-apply (opt-in, off by default) via one generalized system_tag_auto_apply_sweep(mode), guarded by the #141 "also looks like real content" ring-loud check → review strip. Provisional source (process_auto) never trains the head. Mode-aware review strip + new "Auto-tag work-in-progress" settings card. Migration 0086.

#1474 — Soft WIP title tier. sketch/doodle/scribble titles also tag wip, but with a provisional source (wip_title_soft) that never trains the head (a finished "sketch" can't pollute it). Opt-in (off by default). Daily ring-loud audit flags soft-tagged images that look like finished art for review. Migration 0087.

#1476 — Explore reach. The walk now reaches past the anchor's immediate cluster (default reach 0.4) so neighbours mix near+mid-far and it can escape dense signatures without hitting "Random"; already-walked images aren't re-served. Near↔Far slider in the trail. Gallery "more like this" unchanged.

Migrations

0086 (ml_settings process knobs + presentation_review.mode) and 0087 (import_settings soft-wip toggle) — both additive columns with server-defaults, apply on deploy.

Post-deploy (to actually try the new behavior)

  • Settings → ML → flip on "Auto-tag work-in-progress" (WIP head auto-apply), optionally the soft tier under Ingestion & filters.
  • Walk Explore and feel the reach dial — we'll likely tune the default from real use.

CI green on dev head fac5ae6.

🤖 Generated with Claude Code

Ships three stacked, CI-green features from `dev` to `main`. All experience-level changes best validated live. ## What ships **#1464 — System-tag behavior refactor.** `editor screenshot` moves from chrome (hidden) to the PROCESS group (shown in gallery, like wip). `wip`+`editor` gain provisional auto-apply (opt-in, off by default) via one generalized `system_tag_auto_apply_sweep(mode)`, guarded by the #141 "also looks like real content" ring-loud check → review strip. Provisional source (`process_auto`) never trains the head. Mode-aware review strip + new "Auto-tag work-in-progress" settings card. Migration 0086. **#1474 — Soft WIP title tier.** sketch/doodle/scribble titles also tag `wip`, but with a provisional source (`wip_title_soft`) that never trains the head (a finished "sketch" can't pollute it). Opt-in (off by default). Daily ring-loud audit flags soft-tagged images that look like finished art for review. Migration 0087. **#1476 — Explore reach.** The walk now reaches past the anchor's immediate cluster (default reach 0.4) so neighbours mix near+mid-far and it can escape dense signatures without hitting "Random"; already-walked images aren't re-served. Near↔Far slider in the trail. Gallery "more like this" unchanged. ## Migrations 0086 (ml_settings process knobs + presentation_review.mode) and 0087 (import_settings soft-wip toggle) — both additive columns with server-defaults, apply on deploy. ## Post-deploy (to actually try the new behavior) - Settings → ML → flip on **"Auto-tag work-in-progress"** (WIP head auto-apply), optionally the soft tier under Ingestion & filters. - Walk **Explore** and feel the reach dial — we'll likely tune the default from real use. CI green on `dev` head `fac5ae6`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bvandeusen added 4 commits 2026-07-13 12:13:14 -04:00
feat(system-tags): process vs chrome groups + WIP provisional auto-apply (#1464)
CI / lint (push) Successful in 3s
CI / frontend-build (push) Successful in 24s
CI / backend-lint-and-test (push) Successful in 39s
CI / integration (push) Successful in 3m48s
ad2a5fc5fe
Backend for the system-tag behavior refactor (milestone #157). editor screenshot
moves from chrome (hidden) to the PROCESS group (shown, like wip); wip+editor gain
provisional auto-apply so they stop needing endless manual identification —
without a runaway loop.

- tag.py: split PRESENTATION_SYSTEM_TAGS → CHROME_SYSTEM_TAGS (banner) +
  PROCESS_SYSTEM_TAGS (wip, editor screenshot).
- heads.py: generalize presentation_auto_apply_sweep → system_tag_auto_apply_sweep
  (mode chrome|process). Same Guard 1 (skip human/confirmed) + Guard 2 (ring-loud
  conflict → PresentationReview). process mode uses source 'process_auto' and does
  NOT hide (hide is a gallery-query effect of group membership).
- training_data._AUTO_SOURCES += 'process_auto' → the head never trains on its own
  auto-applied output; only wip_title/manual train it (the runaway break).
- ml_settings: process_auto_apply_enabled (OFF, opt-in) + threshold + conflict
  threshold. presentation_review.mode ('chrome'|'process'). Migration 0086.
- gallery_service: default-hide reads CHROME only (editor now shows); Explore
  neighbors exclude the whole PROCESS group.
- tasks/ml + celery beat: scheduled_process_auto_apply (daily, opt-in); prune
  covers both modes.
- api: ml_admin process_* CRUD+validation; hidden-review returns mode.
- tests: rename chrome sweep calls; new test_process_auto_apply (apply, guards,
  mode flag, no-self-train); gallery test asserts editor now visible.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(system-tags): process auto-tag settings UI + mode-aware review strip (#1464)
CI / lint (push) Successful in 3s
CI / frontend-build (push) Successful in 17s
CI / backend-lint-and-test (push) Successful in 26s
CI / integration (push) Successful in 3m44s
d9a14e890d
Frontend for the system-tag refactor (milestone #157 step 6).

- HeadsCard: new 'Auto-tag work-in-progress' section (enable + tag-confidence +
  conflict knobs) for wip/editor process auto-apply, mirroring the chrome card;
  copy notes they stay VISIBLE and the head only learns from titles/manual (no
  runaway). Presentation copy narrowed to banner-only.
- HiddenReviewStrip: mode-aware — chrome flags read 'hidden as X / Keep hidden /
  Un-hide'; process flags read 'auto-tagged X / Keep tag / Remove tag'. Same
  endpoints (the backend returns mode), different words.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(wip): soft title tier — sketch/doodle vocab + ring-loud audit (#1474)
CI / lint (push) Successful in 2s
CI / frontend-build (push) Successful in 23s
CI / backend-lint-and-test (push) Successful in 40s
CI / integration (push) Successful in 3m53s
af0d39ed52
Extends WIP title-tagging to lower-precision cues (sketch/doodle/scribble) safely.

- wip_title.py: soft matcher (word-anchored; sketchbook/kadoodle don't trip it);
  WIP_TITLE_SOFT_SOURCE + soft SQL prefilter; apply_wip_image_tags takes a source arg.
- training_data._AUTO_SOURCES += 'wip_title_soft' → the soft tier is PROVISIONAL and
  never trains the wip head (a finished "sketch" can't pollute it). Only the hard
  tier (wip_title) + manual train.
- ImportSettings.wip_soft_title_tagging_enabled (OFF by default, opt-in). Migration 0087.
- importer: hard tier wins, soft is the fallback (source wip_title_soft).
- backfill: refactored into a shared _backfill_wip_tier; hard always, soft when enabled.
- heads.soft_wip_conflict_audit + daily beat: score soft-tagged images against content
  heads, flag ring-loud ones (PresentationReview mode=process) for the review strip —
  the operator's "measure if they got falsely tagged" safety.
- api settings toggle; ImportFiltersForm soft toggle.
- tests: soft matcher pos/neg; soft source not a training positive; audit flags
  ring-loud + spares quiet.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(explore): reach dial to escape dense clusters + anti-revisit (#1476)
CI / lint (push) Successful in 2s
CI / frontend-build (push) Successful in 21s
CI / backend-lint-and-test (push) Successful in 30s
CI / integration (push) Successful in 3m50s
fac5ae6ce5
The Explore walk got stuck in dense signatures — neighbours all too similar, so
forward-arrow couldn't escape and Random was the only exit. Root cause: MMR only
diversifies WITHIN the nearest ~400 pool; in a dense cluster that whole pool is
near-identical, so there's no escape route in it.

- gallery_service.similar(reach=0.0, exclude_ids=None): reach>0 widens the pool
  (cap 400→1000) and _reach_sample strides across an outward-growing distance span
  so the set handed to MMR spans near→mid-far (guaranteed escape routes), not just
  the tight cluster. exclude_ids drops already-walked images. Gallery 'more like
  this' (reach=0) is unchanged.
- api/gallery similar: parse reach + exclude_ids.
- explore store: default reach 0.4 (auto-diversifies without touching the dial),
  pass the breadcrumb as exclude_ids, setReach action.
- ExploreView: a Near↔Far reach slider in the trail.
- tests: _reach_sample math (deeper ranks with higher reach, near kept); similar
  exclude_ids drops walked + reach path runs clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
bvandeusen merged commit 17903068b4 into main 2026-07-13 12:13:20 -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#223