Get banner / editor-screenshot chrome out of the browsing flow without silently losing real content.
Gallery default-hides banner + editor screenshot (facets too); wip stays visible. A Show hidden toggle (Refine panel) reveals them; an explicit chrome-tag filter also shows them. similar() keeps its own #1274 exclusion.
Auto-hide sweep (presentation_auto_apply_sweep, daily beat) fires chrome heads at their OWN flat threshold (presentation_auto). Guard 1: never auto-hide an image carrying a human/confirmed content tag. Guard 2: if an auto-hide also scores high on a content head, hide it but record a presentation_review flag ("also looks like ⟨X⟩") instead of burying it. _auto_apply_heads now excludes system tags (wip never auto-applies); presentation_auto added to _AUTO_SOURCES (no self-train).
Review strip in the gallery when Show-hidden is on: flagged first, Keep hidden / Un-hide (un-hide removes the tag + records a rejection so the head learns).
## Presentation-chrome auto-hide (milestone #141)
Get banner / editor-screenshot chrome out of the browsing flow without silently losing real content.
- **Gallery** default-hides `banner` + `editor screenshot` (facets too); `wip` stays visible. A **Show hidden** toggle (Refine panel) reveals them; an explicit chrome-tag filter also shows them. `similar()` keeps its own #1274 exclusion.
- **Auto-hide sweep** (`presentation_auto_apply_sweep`, daily beat) fires chrome heads at their OWN flat threshold (`presentation_auto`). **Guard 1**: never auto-hide an image carrying a human/confirmed content tag. **Guard 2**: if an auto-hide also scores high on a content head, hide it but record a `presentation_review` flag ("also looks like ⟨X⟩") instead of burying it. `_auto_apply_heads` now excludes system tags (wip never auto-applies); `presentation_auto` added to `_AUTO_SOURCES` (no self-train).
- **Review strip** in the gallery when Show-hidden is on: flagged first, **Keep hidden** / **Un-hide** (un-hide removes the tag + records a rejection so the head learns).
- **Settings** (Heads card): on/off + hide-confidence + conflict threshold, with ml_admin bounds.
- **Ops**: idempotent sweep (self-recovering), wall-clock bounded, resolved flags pruned after 30 days.
- Migration **0082** (presentation MLSettings columns + `presentation_review` table).
## Tagging-UX fixes
- Tag autocomplete race fixed — no more stale wrong-prefix results (useInflightToken, #1324).
- Auto-tag ✓ Keep button now matches the suggestion accept button (filled green circle).
- Long tag chips no longer overflow the rail / clip their remove ✕ — the name ellipsis-truncates (#1337).
One migration (0082). CI green on dev head `2bcaa20` across every push.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
The ✓ Keep on a provisional auto-tag chip was a smaller tinted-outline variant;
make it the SAME filled green circle (white ✓, 26px, opacity 0.9→1 + scale on
hover, accent focus ring) as the suggestion accept button (.fc-act--yes in
SuggestionItem) so "accept this tag" reads identically across surfaces
(operator-asked).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CDgx8bQS5YrGRK76v8HUnM
A character+fandom(+AUTO) chip could exceed the tag-panel width, pushing the
close ✕ off the right edge so the tag couldn't be removed (operator-flagged with
a "Mirko - Rumi Usagiyama → My Hero Academia AUTO" screenshot). Cap the chip at
100% of the rail and make the NAME the elastic part (ellipsis-truncates), so the
✕, fandom, and AUTO badge stay reachable; the full name stays on the hover title.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CDgx8bQS5YrGRK76v8HUnM
The default gallery + facets now implicitly exclude images carrying a
presentation system tag (banner / editor screenshot), reusing the tag-scope
EXISTS machinery. Suppressed when the operator explicitly filters FOR a
presentation tag OR passes include_hidden (the Hidden view — step 2). `wip` is
NOT hidden (real, in-progress art). include_hidden threaded through
scroll/timeline/jump_cursor/facets + the gallery API _parse_filters. Test covers
default-hide, include_hidden, explicit-filter-shows, and wip-stays-visible.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CDgx8bQS5YrGRK76v8HUnM
The /similar route splats **filters into similar(), which doesn't take the new
include_hidden kwarg → TypeError → 500 (test_gallery_similar). Drop it like
post_id; similar() has its own presentation exclusion (#1274), so the
gallery-browse flag doesn't apply there.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CDgx8bQS5YrGRK76v8HUnM
A Curation-group chip in the facet panel flips include_hidden, threaded through
the gallery filter store (default model, activeFilterParam, applyFilterFromQuery,
cloneFilter, filterToQuery) and counted in the refine badge. Off by default → the
gallery hides banner/editor-screenshot chrome; on → it's revealed. Backend
already honors include_hidden (step 1). The dedicated conflict-flagged review
surface (only the set-aside items) lands in step 5.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CDgx8bQS5YrGRK76v8HUnM
MLSettings gains presentation_auto_apply_enabled / _threshold (default 0.90) +
presentation_conflict_threshold (default 0.50): banner/editor auto-hide with a
FLAT threshold (decoupled from content-head graduation), plus the "also looks
like content" conflict cut. New presentation_review table (image, presentation
tag, conflict tag + score, created/resolved_at) records auto-hides flagged for
review. Migration 0082 (columns + table), ml_admin API (editable + get_settings
+ _validate bounds), settings roundtrip/bounds test. The sweep that reads these
knobs + the Settings UI land in step 4.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CDgx8bQS5YrGRK76v8HUnM
presentation_auto_apply_sweep fires banner/editor-screenshot heads at the FLAT
presentation threshold (source=presentation_auto). Two guards: (1) hard-skip any
image already carrying a human/confirmed content tag — you valued it, so the model
can't bury it; (2) if an auto-hide ALSO scores >= presentation_conflict_threshold
on a content head, hide it but record a PresentationReview row (conflict tag +
score) for the Hidden view.
_auto_apply_heads now excludes system tags, so a graduated wip/banner can't fire
via the content path (and wip never auto-applies at all). presentation_auto added
to _AUTO_SOURCES so auto-hidden chrome never self-trains. Tests: applies,
hard-skip valued, conflict-flag, disabled no-op, ignores wip, content-path
excludes system. Settings UI + scheduling land next.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CDgx8bQS5YrGRK76v8HUnM
HeadsCard gains a "Hide presentation chrome" section: on/off switch + "Hide
confidence" (presentation_auto_apply_threshold) + "Flag if content ≥"
(presentation_conflict_threshold), wired to MLSettings via patchSettings and
loaded on mount. Makes the step-4 sweep's thresholds operator-tunable
(config-in-UI). wip is called out as never auto-hidden.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CDgx8bQS5YrGRK76v8HUnM
GET /api/gallery/hidden-review lists unresolved presentation auto-hide flags
(image + presentation tag + conflict tag/score), most-concerning first. POST
.../keep resolves the flag (the tag stays). POST .../unhide removes the
presentation tag (image returns to the gallery), records a TagSuggestionRejection
so the head learns it misfired, and resolves the flag. Tests for list/keep/unhide.
Frontend review strip (shown when Show-hidden is on) next.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CDgx8bQS5YrGRK76v8HUnM
When "Show hidden" is on, a review strip appears atop the gallery listing the
auto-hidden chrome flagged "also looks like content" (most-concerning first):
thumbnail + "also looks like <X>" + Keep hidden / Un-hide. Un-hide removes the
presentation tag (image returns to the gallery) and trains the head; Keep
resolves the flag. Self-hides when there's nothing to review; theme-token styled.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CDgx8bQS5YrGRK76v8HUnM
scheduled_presentation_auto_apply (daily beat) runs presentation_auto_apply_sweep
— idempotent, so an interrupted run just re-runs next cycle (that's the recovery),
wall-clock bounded by soft/hard task time limits. prune_presentation_reviews
(daily beat) drops RESOLVED review flags older than 30 days (rule 89 retention).
Tests run both tasks via a monkeypatched session factory. Milestone 141 complete:
the presentation-chrome auto-hide + conflict-flagged review is now live end-to-end.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CDgx8bQS5YrGRK76v8HUnM
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.
Presentation-chrome auto-hide (milestone #141)
Get banner / editor-screenshot chrome out of the browsing flow without silently losing real content.
banner+editor screenshot(facets too);wipstays visible. A Show hidden toggle (Refine panel) reveals them; an explicit chrome-tag filter also shows them.similar()keeps its own #1274 exclusion.presentation_auto_apply_sweep, daily beat) fires chrome heads at their OWN flat threshold (presentation_auto). Guard 1: never auto-hide an image carrying a human/confirmed content tag. Guard 2: if an auto-hide also scores high on a content head, hide it but record apresentation_reviewflag ("also looks like ⟨X⟩") instead of burying it._auto_apply_headsnow excludes system tags (wip never auto-applies);presentation_autoadded to_AUTO_SOURCES(no self-train).presentation_reviewtable).Tagging-UX fixes
One migration (0082). CI green on dev head
2bcaa20across every push.🤖 Generated with Claude Code