Skip to content

chore: sync development to main#2783

Merged
maintainerr-automation[bot] merged 6 commits into
mainfrom
development
Apr 27, 2026
Merged

chore: sync development to main#2783
maintainerr-automation[bot] merged 6 commits into
mainfrom
development

Conversation

@maintainerr-automation

Copy link
Copy Markdown
Contributor

Summary

Promotes development to main for release. Squash-merge when approved; release automation continues on approval.

Changes

enoch85 and others added 6 commits April 26, 2026 15:55
)

The runtime PlexApi client had no socket timeout, so a wedged Plex
request could hang the rule executor forever. Add PLEX_REQUEST_TIMEOUT_MS
(30s) to bound it.

Also align plexApi.getWatchHistory with the Jellyfin adapter's contract:
errors propagate so callers can distinguish a real outage from a
confirmed empty history (matches the design documented for the rules
layer's NOT_EXISTS / missing-value handling). Removes silent
.catch(() => null) swallowers in seenBy, sw_allEpisodesSeenBy and
collection_siblings_lastViewedAt that previously turned transient
lookup failures into "viewed by no one".

Refs #2771
* fix(plex): bound request timeout and surface watch-history errors

The runtime PlexApi client had no socket timeout, so a wedged Plex
request could hang the rule executor forever. Add PLEX_REQUEST_TIMEOUT_MS
(30s) to bound it.

Also align plexApi.getWatchHistory with the Jellyfin adapter's contract:
errors propagate so callers can distinguish a real outage from a
confirmed empty history (matches the design documented for the rules
layer's NOT_EXISTS / missing-value handling). Removes silent
.catch(() => null) swallowers in seenBy, sw_allEpisodesSeenBy and
collection_siblings_lastViewedAt that previously turned transient
lookup failures into "viewed by no one".

Refs #2771

* fix(overlays): resolve preset edit, cron discoverability, and tab gating issues

- Fix #2768: preset edit now opens the editor with a copy-on-save flow
  (info description, "Save as copy" button, name modal) and remounts on
  id change so switching to /new from a preset URL no longer leaks state.
- Add post-save modal prompting for a cron schedule when overlays are
  enabled with no schedule set, with a direct link to Job Settings.
- Gate template tabs and Run Now / Reset on persisted overlay-enabled
  state; redirect direct nav to /overlays/templates when disabled.
- Add Docs button on Overlay Settings linking to docs.maintainerr.info/overlays.
- Add useOverlaySettings query + useUpdateOverlaySettings mutation
  mirroring useSettings/usePatchSettings, so the wrapper re-evaluates
  gating after save via cache propagation.
- Extract BrandLink shared component for inline branded body-text links;
  swap manual styling in Metadata, Jobs, AddModal, Calendar, StorageMetrics.
- Replace crontab.org with crontab.guru and dedupe per-row cron links
  into a single link in the Job Settings page description.
- Suppress success alert on copy-on-save navigation (the URL change is
  the confirmation; the alert flashed for one frame and disappeared).
- Sync workspace MCP config (.mcp.json + .vscode/mcp.json) to use
  --output-dir .playwright-mcp; document screenshot path requirement.
apps/ui/tsconfig.json had ignoreDeprecations: "6.0", which is invalid
for TypeScript 5.x and caused tsc to bail before type-checking. CI
exited 0 without scanning anything, so eight pre-existing type errors
went unreported.

- Remove the invalid ignoreDeprecations option (no deprecated options
  remain in the tsconfig that need silencing).
- Drop unused imports in CollectionInfo (DocumentTextIcon,
  CollectionLogDto, isMetaActionedByRule).
- Add the missing MediaItem fields (guid, addedAt, providerIds,
  mediaSources, library) to the CollectionMediaPage test fixture.
- Update the UseQueryResult / QueryClient mock casts in two specs to
  use the project's existing `as unknown as ...` double-cast pattern
  (matches 12 other specs).
…re-eval

Re-evaluate workflow can now catch "feature already exists, user didn't know"
cases that the daily triage's PR-prefix gate misses (e.g. foundational
date-rule support that predates the feat:/fix: convention).

- Lift sleep + the entire model-call layer (throttle, per-run budget,
  retry-with-backoff, retry-after handling, header logging) from
  fider-triage.mjs into a createModelCaller factory in fider-shared.mjs.
- Replace the wrong "Copilot Free 15 RPM / 150 RPD" comment with the
  observed runner-token budget (1000 RPM / 1M TPM, no exposed daily cap)
  from a real re-eval run; pace 1 call/sec with an 800-call sanity ceiling.
- BudgetExhaustedError now propagates through triagePost catches so main()
  aborts cleanly with a deferred-posts log instead of burning iterations
  into the consecutive-failure abort.
- Drop the feat:/fix: PR-title prefix gate on the pre-existing path when
  forceReeval=true; daily run still enforces it for precision.
- Re-eval workflow now sets CHECK_PRE_EXISTING=true so the relaxed path
  actually runs.
- MAX_POSTS_PER_RUN 25 -> 100; consolidate the three judge*WithModel and
  build*Comment functions; collapse filterCandidates +
  filterPreExistingCandidates into one parametric filterPRs.

Net: triage script 844 -> 649 lines (-23%), shared +117 for the lifted
infra; behaviour preserved end-to-end (comment markers byte-identical,
tag slugs unchanged, quote-validation rejection paths preserved).
…ly-pre-existing comment

Both pre-existing flags from the latest re-eval run were partial matches
caused by multi-ask FRs: the bot quoted a PR that delivered one bullet
of a wishlist and tagged the post pre-existing. The new footer addresses
the OP directly via @-mention (already returned on every post by
/api/v1/posts) and asks them to split bundled requests so each can be
triaged independently. The long maintainer-facing "lower confidence than
possibly-completed" preamble that the OP didn't need is gone.

Comment-marker idempotency means existing pre-existing comments will be
edited (not duplicated) to the new text on the next re-eval run.
* Fix overlay SSE EPIPE handling

* refactor(overlays,sse): tighten SSE writer API and overlay revert semantics

- Expose send() on SseStreamClient instead of the raw RxJS Subject
- Restore clearAllStates() in resetAllOverlays so reset is a hard wipe
- Drop no-op axios try/catch in plex-api uploadPoster
- Use plain warn() + debug(error) per logging convention
- RevertItemResult as discriminated string union

---------

Co-authored-by: enoch85 <mailto@danielhansson.nu>
@maintainerr-automation maintainerr-automation Bot added the release:docker-build Build release candidate Docker image label Apr 27, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved by release automation (CODEOWNER approval was verified by Release 2).

@maintainerr-automation maintainerr-automation Bot merged commit 31965d4 into main Apr 27, 2026
37 checks passed
@maintainerr-automation

Copy link
Copy Markdown
Contributor Author

📚 Docs drift report

Comparing origin/mainHEAD against Maintainerr_docs. Informational only — maintainers decide what needs doc updates before release.

Rule glossary parity

  • Code rule keys (rules.constants.ts): 160
  • Documented keys (docs/Glossary.md): 160

Glossary is in sync with the code.

New migrations on this branch

No new migrations.

Rule constants

No changes to rules.constants.ts.

Public contracts (@maintainerr/contracts)

No contract changes.

New HTTP controllers

No new controllers.

feat: commits on this branch

No feat: commits detected.

Behavioral fixes worth reviewing

  • 21e35e3 fix(ui): unblock tsc + fix the type errors it was hiding (fix(ui): unblock tsc and fix the type errors it was hiding #2776)
    • touched: apps/ui/src/components/Collection/CollectionDetail/CollectionInfo/index.tsx, apps/ui/src/components/Rules/RuleGroup/AddModal/ArrAction/index.spec.tsx, apps/ui/src/pages/CollectionMediaPage.spec.tsx, apps/ui/src/pages/CollectionsListPage.spec.tsx, apps/ui/tsconfig.json
  • 5646b1d fix(overlays): preset edit, cron discoverability, tab gating (fix(overlays): preset edit, cron discoverability, tab gating #2775)
    • touched: apps/ui/src/api/overlays.ts, apps/ui/src/components/Calendar/index.tsx, apps/ui/src/components/Common/BrandLink.tsx, apps/ui/src/components/Overlays/index.spec.tsx, apps/ui/src/components/Overlays/index.tsx, apps/ui/src/components/Rules/RuleGroup/AddModal/index.tsx, apps/ui/src/components/Settings/Jobs/index.tsx, apps/ui/src/components/Settings/Metadata/index.tsx, apps/ui/src/components/Settings/Overlays/index.tsx, apps/ui/src/components/Settings/Tabs/index.tsx, apps/ui/src/components/StorageMetrics/index.tsx, apps/ui/src/pages/OverlayTemplateEditorPage.tsx, apps/ui/src/pages/OverlayTemplateListPage.tsx

fix: commits that touched user-facing surfaces (UI, settings, notifications, collections, rule executor, controllers, README). Worth scanning to decide whether observable behavior changed enough to warrant a docs note.

@github-actions

Copy link
Copy Markdown
Contributor

🚀 Release 2.5 - Execute Push PR To Main completed after approval.

  • PR squash-merged into main
  • Sync back: success
  • Build Main: success

@enoch85 enoch85 added this to the 3.9.0 milestone Apr 28, 2026 — with GitHub Codespaces
@maintainerr-automation

Copy link
Copy Markdown
Contributor Author

🎉 This PR is included in version 3.9.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release:docker-build Build release candidate Docker image released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants