• v0.2.1 984e594006

    Release v0.2.1 — architectural gate repair
    🏗️ Build and Test JellyTau / Run Tests (push) Failing after 7m4s
    🏗️ Build and Test JellyTau / Android Compile Check (push) Has been skipped
    Publish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m18s
    Traceability Validation / Check Requirement Traces (push) Successful in 15s
    Build & Release / Run Tests (push) Failing after 6m58s
    Build & Release / Build Linux (push) Has been skipped
    Build & Release / Build Windows (push) Has been skipped
    Build & Release / Build Android (push) Has been skipped
    Build & Release / Create Release (push) Has been skipped

    dtourolle released this 2026-07-30 08:41:45 +00:00 | 204 commits to master since this release

    Internal release. No user-visible change: the search refactor is a pure
    layer move whose acceptance criterion is byte-identical behaviour.

    Two dead safety nets restored — both had the same failure mode, a check
    that existed, was cited in the docs, and could not fail:

    • Traceability gate reported 158% coverage against denominators frozen at
      114 requirements while requirements.md had grown to 213. The 50%
      threshold was unreachable; coverage could have collapsed to 30% and CI
      would still have passed. Denominators now derive from requirements.md at
      run time, coverage is the intersection of traced and defined IDs, and a

      100% reading is a hard error. Real coverage: 85%. (DR-093)

    • Frontend boundary tripwire passed on the very leak it was written for:
      the pattern was anchored to the query site, so assigning the item-type
      array to a named const evaded it. Now matches item-type array literals
      anywhere in src/, with a capped allowlist. (DR-094)

    Search scope taxonomy moved into Rust (UR-049, DR-063). SearchScope +
    item_types() now own the scope→Jellyfin-item-type expansion; the frontend
    sends an opaque scope. Resolved once before the cache/server split so
    online and offline filter identically. Adding a type to a scope now
    touches zero frontend files — the criterion that failed before.

    Removed three broken, orphaned traceability scripts that shared one root
    cause (unscoped grep over ~40GB of target/); one reported "1 requirement"
    and printed "all requirements have implementations".

    Known follow-ups: result-side search grouping (GROUP_ITEM_TYPES) is still
    frontend-side; the player facade has 52 direct commands.player* bypasses
    and no automated check. Specs for both are in docs/specs/.

    Downloads