Ships title-based WIP auto-tagging from dev to main (task #1458). CI-green on dev head 0da0e47 (run 2175: lint/backend/frontend/integration).
What ships
When a freshly-imported post's TITLE explicitly declares work-in-progress ("WIP", "[WIP]", "W.I.P", "work in progress"), the importer auto-applies the wip system tag to its images — a deterministic, precision-first complement to the ML wip head. WIP images are excluded from Explore/training, so this honours the artist's own label at import.
Matcher (services/wip_title.py): token-anchored — swipe/wiped/wiping never match. source="wip_title" stamped on the tag.
Live hook: importer, fresh-import only (never deep-scan/supersede) — a manually-removed WIP tag is never re-applied. Gated by ImportSettings.wip_title_tagging_enabled (default on).
Backfill: POST /settings/wip-title/scan → tasks.maintenance.backfill_wip_title_tags (operator-triggered, idempotent; deliberately not a beat). Settings UI: toggle + "Scan existing posts for WIP titles" button.
Foundation for the follow-up system-tag behavior refactor (editor→process group, WIP provisional auto-apply): wip_title is the trusted, non-self-training label source that bootstraps the wip head.
Post-deploy
New imports tag live. To catch the existing library, press "Scan existing posts for WIP titles" once in Settings → Maintenance → Ingestion & filters.
Ships title-based WIP auto-tagging from `dev` to `main` (task #1458). CI-green on dev head `0da0e47` (run 2175: lint/backend/frontend/integration).
## What ships
When a freshly-imported post's TITLE explicitly declares work-in-progress ("WIP", "[WIP]", "W.I.P", "work in progress"), the importer auto-applies the `wip` system tag to its images — a deterministic, precision-first complement to the ML `wip` head. WIP images are excluded from Explore/training, so this honours the artist's own label at import.
- **Matcher** (`services/wip_title.py`): token-anchored — `swipe`/`wiped`/`wiping` never match. `source="wip_title"` stamped on the tag.
- **Live hook**: importer, fresh-import only (never deep-scan/supersede) — a manually-removed WIP tag is never re-applied. Gated by `ImportSettings.wip_title_tagging_enabled` (default on).
- **Backfill**: `POST /settings/wip-title/scan` → `tasks.maintenance.backfill_wip_title_tags` (operator-triggered, idempotent; deliberately not a beat). Settings UI: toggle + "Scan existing posts for WIP titles" button.
- Migration 0085 (one ImportSettings column). Tests: `test_wip_title.py` (matcher) + `test_wip_title_tagging.py` (integration).
Foundation for the follow-up system-tag behavior refactor (editor→process group, WIP provisional auto-apply): `wip_title` is the trusted, non-self-training label source that bootstraps the wip head.
## Post-deploy
New imports tag live. To catch the existing library, press "Scan existing posts for WIP titles" once in Settings → Maintenance → Ingestion & filters.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Auto-apply the `wip` system tag to posts whose TITLE explicitly declares
work-in-progress ("WIP" / "work in progress") — a deterministic, high-precision
complement to the image-based ML `wip` head. WIP images are excluded from the
Explore/gallery browse, so honouring the artist's own label keeps unfinished
pieces out of the main browse.
- services/wip_title.py: precision-first token-anchored matcher (swipe/wiped
never trip it) + sync apply helpers (source='wip_title', ON CONFLICT DO
NOTHING, chunked under the psycopg param ceiling).
- importer: live hook on FRESH import only (never on deep-scan/supersede), so a
manually-removed WIP tag is never re-applied by a routine re-scan.
- maintenance.backfill_wip_title_tags: operator-triggered back-catalogue sweep
(coarse SQL prefilter + regex confirm, keyset-paginated). Deliberately NOT a
beat — a periodic re-run would silently undo manual removals.
- ImportSettings.wip_title_tagging_enabled (default ON, migration 0085) gating
the live hook; GET/PATCH + POST /settings/wip-title/scan.
- Settings UI: toggle + "Scan existing posts" button.
- Tests: pure matcher unit tests + integration (apply idempotency, backfill
precision).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Ruff I001 fixup for 5719387 — the new .wip_title import belongs after
.thumbnailer (alphabetical), not after .archive_extractor.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
apply_wip_image_tags relied on result.rowcount, but psycopg reports -1 for a
multi-row INSERT ... ON CONFLICT DO NOTHING (executemany path), so the return
count (and the backfill's reported total) was wrong. Compute the count from a
pre-SELECT of already-tagged ids within the same transaction; keep ON CONFLICT
DO NOTHING as a race-safety belt.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.
Ships title-based WIP auto-tagging from
devtomain(task #1458). CI-green on dev head0da0e47(run 2175: lint/backend/frontend/integration).What ships
When a freshly-imported post's TITLE explicitly declares work-in-progress ("WIP", "[WIP]", "W.I.P", "work in progress"), the importer auto-applies the
wipsystem tag to its images — a deterministic, precision-first complement to the MLwiphead. WIP images are excluded from Explore/training, so this honours the artist's own label at import.services/wip_title.py): token-anchored —swipe/wiped/wipingnever match.source="wip_title"stamped on the tag.ImportSettings.wip_title_tagging_enabled(default on).POST /settings/wip-title/scan→tasks.maintenance.backfill_wip_title_tags(operator-triggered, idempotent; deliberately not a beat). Settings UI: toggle + "Scan existing posts for WIP titles" button.test_wip_title.py(matcher) +test_wip_title_tagging.py(integration).Foundation for the follow-up system-tag behavior refactor (editor→process group, WIP provisional auto-apply):
wip_titleis the trusted, non-self-training label source that bootstraps the wip head.Post-deploy
New imports tag live. To catch the existing library, press "Scan existing posts for WIP titles" once in Settings → Maintenance → Ingestion & filters.
🤖 Generated with Claude Code
Auto-apply the `wip` system tag to posts whose TITLE explicitly declares work-in-progress ("WIP" / "work in progress") — a deterministic, high-precision complement to the image-based ML `wip` head. WIP images are excluded from the Explore/gallery browse, so honouring the artist's own label keeps unfinished pieces out of the main browse. - services/wip_title.py: precision-first token-anchored matcher (swipe/wiped never trip it) + sync apply helpers (source='wip_title', ON CONFLICT DO NOTHING, chunked under the psycopg param ceiling). - importer: live hook on FRESH import only (never on deep-scan/supersede), so a manually-removed WIP tag is never re-applied by a routine re-scan. - maintenance.backfill_wip_title_tags: operator-triggered back-catalogue sweep (coarse SQL prefilter + regex confirm, keyset-paginated). Deliberately NOT a beat — a periodic re-run would silently undo manual removals. - ImportSettings.wip_title_tagging_enabled (default ON, migration 0085) gating the live hook; GET/PATCH + POST /settings/wip-title/scan. - Settings UI: toggle + "Scan existing posts" button. - Tests: pure matcher unit tests + integration (apply idempotency, backfill precision). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>