Modal focus/keyboard polish, Camie-in-autocomplete, re-extract self-resume #82

Merged
bvandeusen merged 4 commits from dev into main 2026-06-07 12:17:43 -04:00
Owner

What

Four commits stacked on dev, all CI-green:

  • b797085 — Pick-a-fandom dialog focus/keyboard flow. Focus lands in the search dropdown (driven by the dialog's @after-enter, not the flaky autofocus); Tab → new-fandom field where Enter creates; creating fills the dropdown + returns focus there; Enter accepts. Removed the @update:model-value auto-confirm that closed the dialog the instant a value was set. Focus returns to the tag input on confirm/cancel.
  • 5201fab — Surface the image's ML (Camie) suggestions inline in the tag autocomplete dropdown as you type, de-duped against server hits, marked with an accent border + score chip. Picking one runs the same accept path as the Suggestions panel.
  • a73d932 — Time-box + self-resume the archive re-extract task (cursor + 600s chunk + re-enqueue), so a large backlog finishes across chunks instead of dying at the 30-min soft limit. Independent of the maintenance_long lane isolation.
  • 394c7dc — Test fixture fix (patterned images to avoid the solid-color phash-collapse trap).

CI

Green on dev head 394c7dc (run 687).

🤖 Generated with Claude Code

## What Four commits stacked on dev, all CI-green: - **`b797085`** — Pick-a-fandom dialog focus/keyboard flow. Focus lands in the search dropdown (driven by the dialog's `@after-enter`, not the flaky `autofocus`); Tab → new-fandom field where Enter creates; creating fills the dropdown + returns focus there; Enter accepts. Removed the `@update:model-value` auto-confirm that closed the dialog the instant a value was set. Focus returns to the tag input on confirm/cancel. - **`5201fab`** — Surface the image's ML (Camie) suggestions inline in the tag autocomplete dropdown as you type, de-duped against server hits, marked with an accent border + score chip. Picking one runs the same accept path as the Suggestions panel. - **`a73d932`** — Time-box + self-resume the archive re-extract task (cursor + 600s chunk + re-enqueue), so a large backlog finishes across chunks instead of dying at the 30-min soft limit. Independent of the `maintenance_long` lane isolation. - **`394c7dc`** — Test fixture fix (patterned images to avoid the solid-color phash-collapse trap). ## CI Green on dev head `394c7dc` (run 687). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bvandeusen added 4 commits 2026-06-07 12:17:36 -04:00
fix(modal): keyboard focus flow for the Pick-a-fandom dialog
CI / lint (push) Successful in 2s
CI / frontend-build (push) Successful in 25s
CI / backend-lint-and-test (push) Successful in 27s
CI / integration (push) Successful in 3m7s
b79708524e
Operator-specified flow for character-tag creation: focus starts in the
fandom search dropdown; Tab moves to the new-fandom field where Enter
creates; creating fills the dropdown and returns focus there; Enter in the
dropdown accepts the selection.

- Drive focus from the dialog's @after-enter (autofocus is unreliable inside
  a v-dialog — the focus-trap steals it post-mount); FandomPicker exposes
  focusSearch.
- Drop the @update:model-value auto-confirm that closed the dialog the instant
  selectedId was set — that's what broke create-then-accept (creating set the
  value and immediately confirmed). Enter now accepts (menu-closed + value),
  while an open menu lets Vuetify pick the highlighted item first.
- Tab from search → new-fandom field; Enter there creates, then focus returns
  to the dropdown for a single Enter-to-accept.
- Restore focus to the tag input after the dialog confirms/cancels so the
  keyboard flow continues into the next tag.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(modal): surface ML suggestions inline in the tag autocomplete
CI / lint (push) Successful in 3s
CI / frontend-build (push) Successful in 23s
CI / backend-lint-and-test (push) Successful in 25s
CI / integration (push) Successful in 3m2s
5201fab088
The image's Camie suggestions now appear in the tag input's dropdown as you
type, filtered to the query and de-duped against the server autocomplete hits,
so the operator can pick a suggestion without hunting for it in the Suggestions
panel below (operator-asked 2026-06-07).

- Unified `rows` model (hits → matching suggestions → create row) so the
  highlight index maps 1:1 to a row across all three sections; arrow/Enter/Tab
  drive the whole list.
- Suggestion rows are marked (accent left-border + mdi-auto-fix score chip) and
  show a "new" hint when the suggestion would create a tag.
- Picking a suggestion emits accept-suggestion → TagPanel runs the SAME accept
  path as the Suggestions panel (creates raw tags, records acceptance, drops it
  from the panel), then refreshes the chip rail.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fix(maintenance): time-box + self-resume the archive re-extract task
CI / lint (push) Successful in 3s
CI / frontend-build (push) Successful in 17s
CI / backend-lint-and-test (push) Successful in 25s
CI / integration (push) Failing after 3m3s
a73d9327d8
reextract_archive_attachments loaded ALL PostAttachments and ran in one pass up
to a 30-min soft limit, then died without re-enqueueing — a large archive
backlog would only ever partially process. And a naive re-run can't advance: an
already-extracted archive is still an archive on disk, so it'd re-extract the
same first batch forever.

Give it a real cursor + time-box + self-resume (mirrors normalize_tags_task,
operator-asked 2026-06-07: reasonable timeout, then re-queue so other work keeps
flowing):
- service scans attachments with id > after_id in ascending order, time-boxes
  the chunk, and reports partial=True + resume_after_id (last scanned id).
- task passes a 600s budget and re-enqueues itself from the cursor until the
  scan is exhausted. Routes on the maintenance_long lane.
- This is independent of the maintenance_long lane isolation (already shipped) —
  that stops long tasks starving the quick maintenance queue; this stops the
  re-extract itself dying on a big backlog.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
test(maintenance): patterned images for re-extract resume test
CI / lint (push) Successful in 2s
CI / frontend-build (push) Successful in 19s
CI / backend-lint-and-test (push) Successful in 26s
CI / integration (push) Successful in 3m2s
394c7dcd67
Solid-color members phash-collapse to distance 0, so the second archive's member
deduped away ("held no supported members") and members_imported was 0. Use
structurally distinct patterned jpegs so both members import — the resume cursor
mechanics were already correct.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
bvandeusen merged commit e0d2a20588 into main 2026-06-07 12:17:43 -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#82