-
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 skippedPublish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m18sTraceability Validation / Check Requirement Traces (push) Successful in 15sBuild & Release / Run Tests (push) Failing after 6m58sBuild & Release / Build Linux (push) Has been skippedBuild & Release / Build Windows (push) Has been skippedBuild & Release / Build Android (push) Has been skippedBuild & Release / Create Release (push) Has been skippedreleased this
2026-07-30 08:41:45 +00:00 | 204 commits to master since this releaseInternal 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 a100% 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
-