• bvandeusen released this 2026-05-25 23:01:04 -04:00 | 630 commits to dev since this release

    What's new

    Extension publish flow re-architected — :latest always carries the XPI

    • build.yml now has a sign-extension job that runs BEFORE build-web as a dependency. No more race with a separate extension.yml leaving :latest without the XPI for ~5min until a side-commit triggered a second build.
    • Signed XPIs cached as assets on ext-<version> Forgejo releases. Future builds hit the cache and skip AMO entirely unless the extension version bumps. AMO blocks re-signing the same version (returns 409), so this cache is load-bearing.
    • Extension bumped 1.0.1 → 1.0.2.
    • extension.yml shrinks to lint-only.
    • web-ext-config.cjs removed — web-ext v8 mis-parses .cjs configs as if module.exports were a config option (UsageError: The config option "module.exports" must be specified in camel case). Ignore-files moved inline to each package.json script with --no-config-discovery.

    Deep scan now does what users expect (IR-parity)

    • Re-applies sidecar metadata, fills NULL phash/artist on already-imported rows. Previously was a near-no-op that just chained backfill_phash.
    • New refreshed ImportResult status + ImportBatch.refreshed counter (migration 0019). UI banner shows refreshed N alongside imported/skipped.
    • scan_directory(mode=deep) skip-set excludes only in-flight statuses (completed/skipped paths get re-queued in deep mode). Quick scan keeps the original "any non-failed" semantics.
    • Misleading "Scan complete — no new files" toast replaced with honest workload-aware messaging.

    Archive imports no longer soft-timeout on large libraries

    • Operator hit SoftTimeLimitExceeded() because each archive member re-queried ALL ImageRecord.phash IS NOT NULL rows. Fixed by caching the candidates list on the Importer instance, appending on each imported/superseded outcome, invalidating on supersede/deep-rephash. Same one-cache-per-archive-import pattern IR uses.

    Artist DangerZone reachable in one click

    • ArtistView now has Overview / Settings tabs (sticky at top under TopNav). The cascade-delete UI moved from below the infinite-scroll image grid (unreachable without exhausting the whole gallery) into the Settings tab.

    Test changes

    • test_importer_deep.py: updated for the new "refreshed" status
    • test_phash_dedup.py::test_import_task_maps_superseded_to_complete_and_requeues: added "refreshed" assertion
    • test_scan_deep_requeue.py (new): pins the quick-vs-deep skip-set divergence

    Migration

    • 0019_import_batch_refreshed: adds refreshed: int NOT NULL DEFAULT 0 to import_batch. Backfills in place via server_default.

    🤖 Generated with Claude Code

    Downloads