PostCard redesign — container-query responsive layout, full-post PostModal (Patreon-style, stays in-curator), masonry PostImageGrid, empty-thumb placeholder, Pinia postModal.js store, modal store extended for post-scoped image cycling, htmlSanitize whitelist util for description rendering. ArtistPostsTab widened to 1600px. get_post returns uncapped thumbnails for the modal grid.
IR-style tag-suffix input — TagAutocomplete drops the kind dropdown; new parse_kind_prefix util at backend/app/utils/tag_prefix.py mirrors IR's pattern (KNOWN_KINDS = character, fandom, series); POST /api/tags accepts name without kind and parses prefix at the boundary; explicit kind always wins.
Drop meta + rating tag kinds — alembic 0023 deletes existing meta/rating rows (CASCADE clears related image_tag/alias/allowlist/suggestion_rejection/reference_embedding/series_page) and recreates the tag_kind ENUM without them. Drop/recreate ck_tag_fandom_requires_character CHECK around the type swap to dodge operator does not exist: tag_kind = tag_kind_old. Python enum + frontend KIND_OPTIONS/KIND_COLOR/KIND_ICONS/KINDS trimmed.
Extension v1.0.4 — MV3 content_security_policy.extension_pages override to OMIT upgrade-insecure-requests. The default MV3 CSP was silently upgrading fetch('http://curator/...') to https:// and failing with NS_ERROR_GENERATE_FAILURE. Operator-hit on first Test connection attempt.
Test pin fixes — tests/test_api_tags.py prefix tests repointed from artist:Eric to character:Saber (artist was dropped from KNOWN_KINDS earlier per the provenance-axis separation).
Migrations
alembic 0023_drop_meta_rating_tag_kinds — destructive (DELETEs meta/rating tag rows). Operator chose "clean break" over "convert to general".
Reinstall extension from the new ext-1.0.4 XPI — Test connection no longer NetworkErrors
Tag input on image modal: typing character:Saber parses to (Saber, kind=character) without the dropdown
PostCard compact at narrow widths, expands at wide; click opens PostModal in-curator
SELECT enum_range(NULL::tag_kind); no longer contains meta or rating
## Summary
Five themes accumulated on dev since v26.05.26.5:
1. **PostCard redesign** — container-query responsive layout, full-post `PostModal` (Patreon-style, stays in-curator), masonry `PostImageGrid`, empty-thumb placeholder, Pinia `postModal.js` store, modal store extended for post-scoped image cycling, `htmlSanitize` whitelist util for description rendering. `ArtistPostsTab` widened to 1600px. `get_post` returns uncapped thumbnails for the modal grid.
2. **IR-style tag-suffix input** — `TagAutocomplete` drops the kind dropdown; new `parse_kind_prefix` util at `backend/app/utils/tag_prefix.py` mirrors IR's pattern (KNOWN_KINDS = `character`, `fandom`, `series`); `POST /api/tags` accepts `name` without `kind` and parses prefix at the boundary; explicit `kind` always wins.
3. **Drop `meta` + `rating` tag kinds** — alembic 0023 deletes existing meta/rating rows (CASCADE clears related image_tag/alias/allowlist/suggestion_rejection/reference_embedding/series_page) and recreates the `tag_kind` ENUM without them. Drop/recreate `ck_tag_fandom_requires_character` CHECK around the type swap to dodge `operator does not exist: tag_kind = tag_kind_old`. Python enum + frontend KIND_OPTIONS/KIND_COLOR/KIND_ICONS/KINDS trimmed.
4. **Extension v1.0.4** — MV3 `content_security_policy.extension_pages` override to OMIT `upgrade-insecure-requests`. The default MV3 CSP was silently upgrading `fetch('http://curator/...')` to `https://` and failing with NS_ERROR_GENERATE_FAILURE. Operator-hit on first Test connection attempt.
5. **Test pin fixes** — `tests/test_api_tags.py` prefix tests repointed from `artist:Eric` to `character:Saber` (artist was dropped from KNOWN_KINDS earlier per the provenance-axis separation).
## Migrations
`alembic 0023_drop_meta_rating_tag_kinds` — destructive (DELETEs meta/rating tag rows). Operator chose "clean break" over "convert to general".
## Test plan
- [ ] CI green (Forgejo Actions)
- [ ] Deploy: `:latest` pulled, `app` / `worker` / `ml-worker` / `scheduler` / `web` recreated; alembic 0023 applied
- [ ] Reinstall extension from the new ext-1.0.4 XPI — `Test connection` no longer NetworkErrors
- [ ] Tag input on image modal: typing `character:Saber` parses to (Saber, kind=character) without the dropdown
- [ ] PostCard compact at narrow widths, expands at wide; click opens PostModal in-curator
- [ ] `SELECT enum_range(NULL::tag_kind);` no longer contains `meta` or `rating`
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.
Summary
Five themes accumulated on dev since v26.05.26.5:
PostCard redesign — container-query responsive layout, full-post
PostModal(Patreon-style, stays in-curator), masonryPostImageGrid, empty-thumb placeholder, PiniapostModal.jsstore, modal store extended for post-scoped image cycling,htmlSanitizewhitelist util for description rendering.ArtistPostsTabwidened to 1600px.get_postreturns uncapped thumbnails for the modal grid.IR-style tag-suffix input —
TagAutocompletedrops the kind dropdown; newparse_kind_prefixutil atbackend/app/utils/tag_prefix.pymirrors IR's pattern (KNOWN_KINDS =character,fandom,series);POST /api/tagsacceptsnamewithoutkindand parses prefix at the boundary; explicitkindalways wins.Drop
meta+ratingtag kinds — alembic 0023 deletes existing meta/rating rows (CASCADE clears related image_tag/alias/allowlist/suggestion_rejection/reference_embedding/series_page) and recreates thetag_kindENUM without them. Drop/recreateck_tag_fandom_requires_characterCHECK around the type swap to dodgeoperator does not exist: tag_kind = tag_kind_old. Python enum + frontend KIND_OPTIONS/KIND_COLOR/KIND_ICONS/KINDS trimmed.Extension v1.0.4 — MV3
content_security_policy.extension_pagesoverride to OMITupgrade-insecure-requests. The default MV3 CSP was silently upgradingfetch('http://curator/...')tohttps://and failing with NS_ERROR_GENERATE_FAILURE. Operator-hit on first Test connection attempt.Test pin fixes —
tests/test_api_tags.pyprefix tests repointed fromartist:Erictocharacter:Saber(artist was dropped from KNOWN_KINDS earlier per the provenance-axis separation).Migrations
alembic 0023_drop_meta_rating_tag_kinds— destructive (DELETEs meta/rating tag rows). Operator chose "clean break" over "convert to general".Test plan
:latestpulled,app/worker/ml-worker/scheduler/webrecreated; alembic 0023 appliedTest connectionno longer NetworkErrorscharacter:Saberparses to (Saber, kind=character) without the dropdownSELECT enum_range(NULL::tag_kind);no longer containsmetaorrating