Thanks to visit codestin.com
Credit goes to github.com

Skip to content

feat(rules): add Sonarr seasonFileRank for season-level rolling windows#3223

Merged
enoch85 merged 2 commits into
developmentfrom
feat-season-rank
Jul 4, 2026
Merged

feat(rules): add Sonarr seasonFileRank for season-level rolling windows#3223
enoch85 merged 2 commits into
developmentfrom
feat-season-rank

Conversation

@enoch85

@enoch85 enoch85 commented Jul 4, 2026

Copy link
Copy Markdown
Collaborator

Adds Sonarr seasonFileRank (NUMBER, id 35, season scope only): ranks a season within its show by the air date of its newest downloaded episode, newest = 1. Together with seriesId this enables season-level rolling windows: seasonFileRank bigger than 2 AND seriesId equals X keeps the newest two seasons of a show and selects the older ones.

Stacked on #3095 - it extends that PR's rank-map machinery, so this branch contains its commit and should be rebased/merged after it lands.

Design notes:

  • Season order is derived from the same run-cached episode pool as episodeFileRank (the builder now also emits a season map in the same cache entry - zero extra Sonarr calls). Season statistics.previousAiring was deliberately rejected as the ordering key: verified against a real Sonarr that it is monitored-dependent and absent for unmonitored content, so Maintainerr's own unmonitor actions would erase the ranking key mid-lifecycle.
  • Pool semantics mirror the episode rank: only seasons with at least one downloaded episode take a rank slot; specials (S00), unaired-only seasons, and out-of-pool seasons return null (fail-closed); transient Sonarr failures return undefined.

Validated on the real dev stack: 15 real hardlinked episode files across five seasons of a real 7,362-episode daily series; /api/rules/test returned ranks 5..1 in exact newest-downloaded-episode order, a full run matched exactly the three oldest seasons, and Playwright confirmed the property is offered only at Seasons scope (absent for Shows/Episodes). Full suite green (102 suites / 1,866 tests).

Ranks a season within its show by the air date of its newest downloaded
episode (newest = 1), enabling keep-newest-N-seasons rules. Derived from the
same run-cached episode pool as episodeFileRank (one shared rank-map cache
entry per show, no extra Sonarr calls); season statistics were deliberately
not used because previousAiring is monitored-dependent and Maintainerr's own
unmonitor actions would erase the ranking key. Seasons without downloaded
episodes take no rank slot; specials and unaired-only seasons rank null so
the comparator stays fail-closed.
@enoch85 enoch85 force-pushed the feat-season-rank branch from ffe17fd to 424a59c Compare July 4, 2026 09:30
@enoch85 enoch85 merged commit 175887a into development Jul 4, 2026
8 checks passed
@enoch85 enoch85 deleted the feat-season-rank branch July 4, 2026 10:23
enoch85 added a commit to Maintainerr/Maintainerr_docs that referenced this pull request Jul 4, 2026
…erties (#106)

* docs(rules): document Sonarr episode retention rank and arr scoping properties

Covers the episodeFileRank/seriesTitle/seriesId properties from
Maintainerr/Maintainerr#3095 and the Radarr movieTitle/movieId pair from
Maintainerr/Maintainerr#3222, with a keep-newest-N walkthrough. Also converts
a stray em dash to a plain hyphen.

* docs(rules): add seasonFileRank to the episode retention section

Covers Maintainerr/Maintainerr#3223.

* docs(rules): integrate seasonFileRank properly (count, order, season walkthrough)

* docs(rules): split episode and season retention walkthroughs, clarify daily-series behavior

Review polish: each retention level gets its own self-contained recipe with
expected outcome, the scoping advice is stated once up front, and a dedicated
daily-series section spells out date-only episode matching, year-seasons, and
that airing without downloading never moves the window.

* docs(rules): match the renamed rank labels (Maintainerr/Maintainerr#3224)

* docs(rules): final label wording (1 = latest)
maintainerr-automation Bot added a commit that referenced this pull request Jul 4, 2026
* build(deps): bump @sigstore/core from 3.0.0 to 3.2.1 (#3182)

Bumps [@sigstore/core](https://github.com/sigstore/sigstore-js) from 3.0.0 to 3.2.1.
- [Release notes](https://github.com/sigstore/sigstore-js/releases)
- [Commits](https://github.com/sigstore/sigstore-js/compare/@sigstore/[email protected]...@sigstore/[email protected])

---
updated-dependencies:
- dependency-name: "@sigstore/core"
  dependency-version: 3.2.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump js-yaml from 3.14.2 to 3.15.0 (#3183)

Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 3.14.2 to 3.15.0.
- [Changelog](https://github.com/nodeca/js-yaml/blob/3.15.0/CHANGELOG.md)
- [Commits](nodeca/js-yaml@3.14.2...3.15.0)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 3.15.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix: keep server booting when sharp can't load on pre-x86-64-v2 CPUs (#3184)

sharp 0.35's prebuilt Linux x64 binaries require the x86-64-v2
microarchitecture (libvips 8.18). On older CPUs or minimal VM CPU
models (e.g. QEMU kvm64) the native addon throws while loading at
require() time, which crashed the whole server during Nest bootstrap —
Maintainerr would not start after updating past v3.14.0.

Load sharp through a small try/catch wrapper so the failure no longer
takes down boot. The server starts; only the image features (overlays,
collection posters) degrade, and a clear startup message explains the
CPU requirement. Same sharp package — no dependency change.

* build(deps-dev): bump knip from 6.21.0 to 6.23.0 (#3187)

Bumps [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) from 6.21.0 to 6.23.0.
- [Release notes](https://github.com/webpro-nl/knip/releases)
- [Commits](https://github.com/webpro-nl/knip/commits/[email protected]/packages/knip)

---
updated-dependencies:
- dependency-name: knip
  dependency-version: 6.23.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump eslint from 10.5.0 to 10.6.0 in the eslint group (#3186)

Bumps the eslint group with 1 update: [eslint](https://github.com/eslint/eslint).


Updates `eslint` from 10.5.0 to 10.6.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](eslint/eslint@v10.5.0...v10.6.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 10.6.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump @tanstack/react-query from 5.101.1 to 5.101.2 (#3188)

Bumps [@tanstack/react-query](https://github.com/TanStack/query/tree/HEAD/packages/react-query) from 5.101.1 to 5.101.2.
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/react-query/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/@tanstack/[email protected]/packages/react-query)

---
updated-dependencies:
- dependency-name: "@tanstack/react-query"
  dependency-version: 5.101.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @tailwindcss/vite from 4.3.1 to 4.3.2 (#3190)

Bumps [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite) from 4.3.1 to 4.3.2.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.2/packages/@tailwindcss-vite)

---
updated-dependencies:
- dependency-name: "@tailwindcss/vite"
  dependency-version: 4.3.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @tanstack/eslint-plugin-query (#3189)

Bumps [@tanstack/eslint-plugin-query](https://github.com/TanStack/query/tree/HEAD/packages/eslint-plugin-query) from 5.101.1 to 5.101.2.
- [Release notes](https://github.com/TanStack/query/releases)
- [Changelog](https://github.com/TanStack/query/blob/main/packages/eslint-plugin-query/CHANGELOG.md)
- [Commits](https://github.com/TanStack/query/commits/@tanstack/[email protected]/packages/eslint-plugin-query)

---
updated-dependencies:
- dependency-name: "@tanstack/eslint-plugin-query"
  dependency-version: 5.101.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump @nestjs/swagger in the nestjs group (#3192)

Bumps the nestjs group with 1 update: [@nestjs/swagger](https://github.com/nestjs/swagger).


Updates `@nestjs/swagger` from 11.4.4 to 11.4.5
- [Release notes](https://github.com/nestjs/swagger/releases)
- [Commits](nestjs/swagger@11.4.4...11.4.5)

---
updated-dependencies:
- dependency-name: "@nestjs/swagger"
  dependency-version: 11.4.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: nestjs
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump turbo from 2.10.0 to 2.10.1 (#3193)

Bumps [turbo](https://github.com/vercel/turborepo) from 2.10.0 to 2.10.1.
- [Release notes](https://github.com/vercel/turborepo/releases)
- [Changelog](https://github.com/vercel/turborepo/blob/main/RELEASE.md)
- [Commits](vercel/turborepo@v2.10.0...v2.10.1)

---
updated-dependencies:
- dependency-name: turbo
  dependency-version: 2.10.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump react-router-dom from 7.18.0 to 7.18.1 (#3194)

Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 7.18.0 to 7.18.1.
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/[email protected]/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/[email protected]/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router-dom
  dependency-version: 7.18.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @eslint-react/eslint-plugin from 5.9.3 to 5.10.0 (#3195)

Bumps [@eslint-react/eslint-plugin](https://github.com/Rel1cx/eslint-react/tree/HEAD/plugins/eslint-plugin) from 5.9.3 to 5.10.0.
- [Release notes](https://github.com/Rel1cx/eslint-react/releases)
- [Changelog](https://github.com/Rel1cx/eslint-react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/Rel1cx/eslint-react/commits/v5.10.0/plugins/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@eslint-react/eslint-plugin"
  dependency-version: 5.10.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @typescript-eslint/eslint-plugin (#3196)

Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 8.62.0 to 8.62.1.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.62.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump typescript-eslint from 8.62.0 to 8.62.1 (#3197)

Bumps [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) from 8.62.0 to 8.62.1.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.62.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump nodemailer from 9.0.1 to 9.0.2 (#3199)

Bumps [nodemailer](https://github.com/nodemailer/nodemailer) from 9.0.1 to 9.0.2.
- [Release notes](https://github.com/nodemailer/nodemailer/releases)
- [Changelog](https://github.com/nodemailer/nodemailer/blob/master/CHANGELOG.md)
- [Commits](nodemailer/nodemailer@v9.0.1...v9.0.2)

---
updated-dependencies:
- dependency-name: nodemailer
  dependency-version: 9.0.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump prettier from 3.8.5 to 3.9.4 (#3198)

* build(deps-dev): bump prettier from 3.8.5 to 3.9.4

Bumps [prettier](https://github.com/prettier/prettier) from 3.8.5 to 3.9.4.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](prettier/prettier@3.8.5...3.9.4)

---
updated-dependencies:
- dependency-name: prettier
  dependency-version: 3.9.4
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>

* style: apply prettier 3.9.4 formatting

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: enoch85 <[email protected]>

* fix(deps): patch vulnerable transitive deps via resolutions (#3201)

Force-resolve transitive packages flagged by Dependabot to their patched
versions (their parents pin exact/old versions, so a resolution is the
only way to lift them):

- multer 2.1.1 -> 2.2.0 (via @nestjs/platform-express) — DoS
- dompurify 3.4.2 -> 3.4.11 (via monaco-editor) — XSS/sanitizer bypass
- linkify-it 5.0.0 -> 5.0.1 (via mailparser) — quadratic complexity
- undici 6.25.0 -> 6.27.0 (existing pin) — header/DoS issues

undici 7.x (->7.28.0) and js-yaml 4.x (->4.3.0) resolve to patched
versions naturally from the lockfile; no resolution needed.

Remaining: undici 5.29.0 via @actions/http-client (dev/CI tooling, not
in the production image) needs undici 5->6, a major that breaks the
parent, so it is intentionally left.

* build(deps): bump nodemailer from 9.0.2 to 9.0.3 (#3202)

Bumps [nodemailer](https://github.com/nodemailer/nodemailer) from 9.0.2 to 9.0.3.
- [Release notes](https://github.com/nodemailer/nodemailer/releases)
- [Changelog](https://github.com/nodemailer/nodemailer/blob/master/CHANGELOG.md)
- [Commits](nodemailer/nodemailer@v9.0.2...v9.0.3)

---
updated-dependencies:
- dependency-name: nodemailer
  dependency-version: 9.0.3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump turbo from 2.10.1 to 2.10.2 (#3204)

Bumps [turbo](https://github.com/vercel/turborepo) from 2.10.1 to 2.10.2.
- [Release notes](https://github.com/vercel/turborepo/releases)
- [Changelog](https://github.com/vercel/turborepo/blob/main/RELEASE.md)
- [Commits](vercel/turborepo@v2.10.1...v2.10.2)

---
updated-dependencies:
- dependency-name: turbo
  dependency-version: 2.10.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump vite from 8.1.0 to 8.1.2 (#3205)

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.1.0 to 8.1.2.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.1.2/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.1.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @types/node from 26.0.0 to 26.1.0 (#3206)

Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 26.0.0 to 26.1.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump sharp from 0.35.2 to 0.35.3 (#3207)

Bumps [sharp](https://github.com/lovell/sharp) from 0.35.2 to 0.35.3.
- [Release notes](https://github.com/lovell/sharp/releases)
- [Commits](lovell/sharp@v0.35.2...v0.35.3)

---
updated-dependencies:
- dependency-name: sharp
  dependency-version: 0.35.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @typescript-eslint/parser from 8.62.0 to 8.62.1 (#3208)

Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 8.62.0 to 8.62.1.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.62.1/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.62.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Document health probes and LOG_LEVEL override (#3210)

* Potential fix for code scanning alert no. 199: Untrusted Checkout TOCTOU (#3209)

* Potential fix for code scanning alert no. 199: Untrusted Checkout TOCTOU

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>

* ci: don't persist credentials when checking out untrusted PR code

Keep the workflow GITHUB_TOKEN (packages:write / pull-requests:write) out of
the checked-out worktree that this job builds, complementing the SHA-pin/verify.

---------

Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: enoch85 <[email protected]>

* fix(collections): distinguish a missing library from an empty one (#3203) (#3211)

An automatic collection with no server-side collection cleared its link and
always logged that it would be recreated automatically when items match the
rule. That is false when the collection's target Plex library section is gone
(removed, or recreated with a new id) — the 404 the user sees. Check whether
the library still exists and log an actionable message telling the user to
re-point the collection, keeping the auto-create message only for a valid but
empty library. Inconclusive library fetches stay silent so a transient blip
never mislabels a library as missing.

* build(deps-dev): bump knip from 6.23.0 to 6.24.0 (#3213)

Bumps [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) from 6.23.0 to 6.24.0.
- [Release notes](https://github.com/webpro-nl/knip/releases)
- [Commits](https://github.com/webpro-nl/knip/commits/[email protected]/packages/knip)

---
updated-dependencies:
- dependency-name: knip
  dependency-version: 6.24.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump eslint-plugin-jest from 29.15.3 to 29.15.4 (#3214)

Bumps [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest) from 29.15.3 to 29.15.4.
- [Release notes](https://github.com/jest-community/eslint-plugin-jest/releases)
- [Changelog](https://github.com/jest-community/eslint-plugin-jest/blob/main/CHANGELOG.md)
- [Commits](jest-community/eslint-plugin-jest@v29.15.3...v29.15.4)

---
updated-dependencies:
- dependency-name: eslint-plugin-jest
  dependency-version: 29.15.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @types/node from 26.0.0 to 26.1.0 (#3215)

Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 26.0.0 to 26.1.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 26.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump vite from 8.1.2 to 8.1.3 (#3216)

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.1.2 to 8.1.3.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.1.3/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.1.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump rolldown from 1.1.3 to 1.1.4 (#3217)

Bumps [rolldown](https://github.com/rolldown/rolldown/tree/HEAD/packages/rolldown) from 1.1.3 to 1.1.4.
- [Release notes](https://github.com/rolldown/rolldown/releases)
- [Changelog](https://github.com/rolldown/rolldown/blob/main/CHANGELOG.md)
- [Commits](https://github.com/rolldown/rolldown/commits/v1.1.4/packages/rolldown)

---
updated-dependencies:
- dependency-name: rolldown
  dependency-version: 1.1.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps): bump sigstore from 4.0.0 to 4.1.1 (#3218)

Bumps [sigstore](https://github.com/sigstore/sigstore-js) from 4.0.0 to 4.1.1.
- [Release notes](https://github.com/sigstore/sigstore-js/releases)
- [Commits](https://github.com/sigstore/sigstore-js/compare/[email protected]@4.1.1)

---
updated-dependencies:
- dependency-name: sigstore
  dependency-version: 4.1.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* build(deps-dev): bump @eslint-react/eslint-plugin from 5.10.0 to 5.10.2 (#3219)

Bumps [@eslint-react/eslint-plugin](https://github.com/Rel1cx/eslint-react/tree/HEAD/plugins/eslint-plugin) from 5.10.0 to 5.10.2.
- [Release notes](https://github.com/Rel1cx/eslint-react/releases)
- [Changelog](https://github.com/Rel1cx/eslint-react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/Rel1cx/eslint-react/commits/v5.10.2/plugins/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@eslint-react/eslint-plugin"
  dependency-version: 5.10.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore: ban em/en dashes, convert existing source usages to hyphens (#3212)

* chore: ban em/en dashes and convert existing usages to hyphens

Replaces every em dash (U+2014) and en dash (U+2013) with a plain ASCII hyphen
across TypeScript/TSX and CSS source (comments, log and UI strings, tests), and
adds the convention to AGENTS.md and project-notes.instructions.md so new code
keeps to a single ASCII dash. Purely mechanical in source; no behavior change.

Markdown prose was intentionally left out of scope.

* chore: extend em/en dash ban to docs, markdown, workflows, and tooling

Complete the sweep beyond source: convert em (U+2014) and en (U+2013)
dashes to plain hyphens across docs/, instruction files, .github
workflows, tooling scripts, CHANGELOG, and config. The two lines that
document the ban by showing the banned characters as examples
(AGENTS.md, project-notes.instructions.md) are intentionally preserved.

* feat(rules): add Sonarr episodeFileRank with seriesTitle/seriesId scoping (#3095)

- episodeFileRank: rank on-disk episodes per show by air date (newest = 1).
  Pool requires hasFile, excludes specials (S00), unaired, and null-airDate
  episodes; out-of-pool ranks null so the comparator stays fail-closed.
  Rank maps are memoised through ArrLookupCache so long-running daily
  series fetch the full episode list once per show per rule-run.
- Daily-series airDate fallback for Plex items carrying parentIndex (year)
  but no episode index; keyed on Sonarr's broadcast-date string (not a UTC
  day-bucket) so US primetime broadcasts straddling UTC midnight still match.
- seriesTitle (TEXT) and seriesId (NUMBER) as scoping handles for
  rank-and-delete rules; seriesId survives a title rename or regional/year
  suffix.

* feat(rules): add Radarr movieTitle/movieId scoping properties (#3222)

Movie-scope handles mirroring Sonarr's seriesTitle/seriesId (#3220):
movieTitle (TEXT, case-insensitive matching) and movieId (NUMBER, the
rename-proof handle for destructive rules). Read from the resolved Radarr
movie; not-tracked stays null and transient lookup failures stay undefined,
matching the getter contract.

* feat(rules): add Sonarr seasonFileRank for season-level rolling windows (#3223)

Ranks a season within its show by the air date of its newest downloaded
episode (newest = 1), enabling keep-newest-N-seasons rules. Derived from the
same run-cached episode pool as episodeFileRank (one shared rank-map cache
entry per show, no extra Sonarr calls); season statistics were deliberately
not used because previousAiring is monitored-dependent and Maintainerr's own
unmonitor actions would erase the ranking key. Seasons without downloaded
episodes take no rank slot; specials and unaired-only seasons rank null so
the comparator stays fail-closed.

* fix(rules): plainer labels for the rank properties (#3224)

'Episode/Season position by air date (1 = latest)' replaces the 'file rank'
labels: simpler words chosen for instant readability, including for
non-native English speakers. Display-only; stored rules and YAML exports
reference the internal property names/ids, which are unchanged.

* fix(collections): accept hex-GUID context.id for manual season/episode actions (#3225)

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: maintainerr-automation[bot] <261505141+maintainerr-automation[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: enoch85 <[email protected]>
Co-authored-by: Kristian Matthews-Kennington <[email protected]>
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: Jack McPherson <[email protected]>
@maintainerr-automation

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.17.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

doonga pushed a commit to greyrock-labs/home-ops that referenced this pull request Jul 6, 2026
… ➔ 3.17.0) (#460)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/maintainerr/maintainerr](https://github.com/Maintainerr/Maintainerr) | minor | `3.16.0` → `3.17.0` |

---

### Release Notes

<details>
<summary>Maintainerr/Maintainerr (ghcr.io/maintainerr/maintainerr)</summary>

### [`v3.17.0`](https://github.com/Maintainerr/Maintainerr/blob/HEAD/CHANGELOG.md#3170-2026-07-05)

[Compare Source](Maintainerr/Maintainerr@v3.16.0...v3.17.0)

#### Highlights

- Added new rule properties for Sonarr and Radarr, enabling advanced filtering and scoping capabilities for media management ([#&#8203;3095](Maintainerr/Maintainerr#3095), [#&#8203;3222](Maintainerr/Maintainerr#3222), [#&#8203;3223](Maintainerr/Maintainerr#3223)).
- Fixed server startup issue on older CPUs or minimal VM models by handling `sharp` library compatibility ([#&#8203;3184](Maintainerr/Maintainerr#3184)).
- Improved library reconciliation to handle transient errors and clarified error messaging for unavailable libraries ([#&#8203;3226](Maintainerr/Maintainerr#3226)).

#### Features

- Added `seasonFileRank` rule property for Sonarr, enabling season-level rolling windows ([#&#8203;3223](Maintainerr/Maintainerr#3223)).
- Added `movieTitle` and `movieId` rule properties for Radarr, allowing movie-specific scoping ([#&#8203;3222](Maintainerr/Maintainerr#3222)).
- Added `episodeFileRank` rule property for Sonarr with `seriesTitle` and `seriesId` scoping ([#&#8203;3095](Maintainerr/Maintainerr#3095)).

#### Fixes

- Hardened library reconciliation against transient errors and clarified error messaging for unavailable libraries ([#&#8203;3226](Maintainerr/Maintainerr#3226)).
- Fixed manual "Add to collection" for Jellyfin by supporting hex-GUID `context.id` ([#&#8203;3225](Maintainerr/Maintainerr#3225)).
- Updated rule-builder labels for rank properties to improve clarity and readability ([#&#8203;3224](Maintainerr/Maintainerr#3224)).
- Resolved issue where missing libraries were misinterpreted as empty during automatic collection creation ([#&#8203;3203](Maintainerr/Maintainerr#3203), [#&#8203;3211](Maintainerr/Maintainerr#3211)).
- Addressed server crash during startup on pre-x86-64-v2 CPUs by handling `sharp` library loading ([#&#8203;3184](Maintainerr/Maintainerr#3184)).

#### Performance

- Improved defense against potential code scanning alert related to untrusted checkout in GitHub Actions ([#&#8203;3209](Maintainerr/Maintainerr#3209)).

#### Database migrations

- Backfilled the `operator` field in stored rules to ensure explicit values for section and within-section operators, preventing unintended behavior changes.

#### Internal

- Documented `LOG_LEVEL` environment override and health probe endpoints ([#&#8203;3210](Maintainerr/Maintainerr#3210)).

#### Dependencies

- Updated 28 dependencies, including `sharp`, `typescript-eslint`, `eslint`, and `prettier`.

#### New Contributors

- [@&#8203;jackemcpherson](https://github.com/jackemcpherson) made their first contribution in [#&#8203;3095](Maintainerr/Maintainerr#3095)

</details>

---

### Configuration

📅 **Schedule**: (in timezone America/New_York)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNDcuMCIsInVwZGF0ZWRJblZlciI6IjQzLjI0Ny4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19-->

Reviewed-on: https://git.greyrock.io/greyrock-labs/home-ops/pulls/460
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant