Repository navigation
chore(sync): merge master into beta (manual conflict resolution) - #1074
Closed
github-actions[bot] wants to merge 65 commits into
Closed
github-actions[bot] wants to merge 65 commits into
github-actions[bot] wants to merge 65 commits into
Conversation
…1003) Bumps [marked](https://github.com/markedjs/marked) from 18.1.0 to 18.1.1. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/markedjs/marked/releases">marked's releases</a>.</em></p> <blockquote> <h2>v18.1.1</h2> <h2><a href="https://github.com/markedjs/marked/compare/v18.1.0...v18.1.1">18.1.1</a> (2026-10-12)</h2> <h3>Bug Fixes</h3> <ul> <li><strong>cli:</strong> honor an explicitly empty string input (<a href="https://redirect.github.com/markedjs/marked/issues/4113">#4113</a>) (<a href="https://github.com/markedjs/marked/commit/ec3a4e511aa0d60b3e9ab8aa0c769407cdaf08d9">ec3a4e5</a>)</li> <li>end blockquote before a lazy line after a heading, hr or html block (<a href="https://redirect.github.com/markedjs/marked/issues/4115">#4115</a>) (<a href="https://github.com/markedjs/marked/commit/9e64a6a3fe6b826d113fc337c21ebe345455a842">9e64a6a</a>)</li> <li>keep a backslash in a code span from hiding emphasis (<a href="https://redirect.github.com/markedjs/marked/issues/4117">#4117</a>) (<a href="https://github.com/markedjs/marked/commit/6a57018fc906333d358981682fd693e4bb85940f">6a57018</a>)</li> <li>keep a decoded character reference from forming a new one (<a href="https://redirect.github.com/markedjs/marked/issues/4111">#4111</a>) (<a href="https://github.com/markedjs/marked/commit/6bbac0cdb72cc3038baefe768c03f788e46126a5">6bbac0c</a>), closes <a href="https://redirect.github.com/markedjs/marked/issues/38">#38</a> <a href="https://redirect.github.com/markedjs/marked/issues/112">#112</a></li> <li>let indented and type 3-5 html blocks interrupt a paragraph (<a href="https://redirect.github.com/markedjs/marked/issues/4124">#4124</a>) (<a href="https://github.com/markedjs/marked/commit/eaa1fffb30fa334cc11ab93f1e5aaa1d2b916e7c">eaa1fff</a>)</li> <li>make walkTokens linear by appending values in place (<a href="https://redirect.github.com/markedjs/marked/issues/4121">#4121</a>) (<a href="https://github.com/markedjs/marked/commit/627d9ae4e5ea403580782a8f6e21fbc8bf56f4c1">627d9ae</a>), closes <a href="https://redirect.github.com/markedjs/marked/issues/4120">#4120</a></li> <li>match pre, script, style and textarea as whole tag names (<a href="https://redirect.github.com/markedjs/marked/issues/4114">#4114</a>) (<a href="https://github.com/markedjs/marked/commit/0db74cb0194f3acb5a53b14a73c2cd087c3c9981">0db74cb</a>)</li> <li>preserve enclosing link state after parsing images (<a href="https://redirect.github.com/markedjs/marked/issues/4123">#4123</a>) (<a href="https://github.com/markedjs/marked/commit/cc07bb9cb62bfd41a724d0a426f194188d7b35c1">cc07bb9</a>)</li> <li>respect tab stops in list continuation indentation (<a href="https://redirect.github.com/markedjs/marked/issues/4119">#4119</a>) (<a href="https://github.com/markedjs/marked/commit/4bd252811fb24ca6b7e22f60c39b89efc2b265d2">4bd2528</a>)</li> </ul> <h3>Performance Improvements</h3> <ul> <li>avoid repeated raw string copies in nested lists (<a href="https://redirect.github.com/markedjs/marked/issues/4082">#4082</a>) (<a href="https://github.com/markedjs/marked/commit/7e8754d60b3c37be30aa17106ada623d1f0cf9db">7e8754d</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/markedjs/marked/commit/cdbdc0122ab83b2b97560944bf009a22cfb78b05"><code>cdbdc01</code></a> chore(release): 18.1.1 [skip ci]</li> <li><a href="https://github.com/markedjs/marked/commit/2134976c497fef671d47fc3e2a0d58ea44ac9a53"><code>2134976</code></a> docs: add AGENTS.md (<a href="https://redirect.github.com/markedjs/marked/issues/4125">#4125</a>)</li> <li><a href="https://github.com/markedjs/marked/commit/699a969fe30855bce777364e9692df2279e8a65b"><code>699a969</code></a> chore(deps-dev): bump handlebars from 4.7.9 to 4.7.10 (<a href="https://redirect.github.com/markedjs/marked/issues/4133">#4133</a>)</li> <li><a href="https://github.com/markedjs/marked/commit/6a57018fc906333d358981682fd693e4bb85940f"><code>6a57018</code></a> fix: keep a backslash in a code span from hiding emphasis (<a href="https://redirect.github.com/markedjs/marked/issues/4117">#4117</a>)</li> <li><a href="https://github.com/markedjs/marked/commit/eaa1fffb30fa334cc11ab93f1e5aaa1d2b916e7c"><code>eaa1fff</code></a> fix: let indented and type 3-5 html blocks interrupt a paragraph (<a href="https://redirect.github.com/markedjs/marked/issues/4124">#4124</a>)</li> <li><a href="https://github.com/markedjs/marked/commit/7e8754d60b3c37be30aa17106ada623d1f0cf9db"><code>7e8754d</code></a> perf: avoid repeated raw string copies in nested lists (<a href="https://redirect.github.com/markedjs/marked/issues/4082">#4082</a>)</li> <li><a href="https://github.com/markedjs/marked/commit/cc07bb9cb62bfd41a724d0a426f194188d7b35c1"><code>cc07bb9</code></a> fix: preserve enclosing link state after parsing images (<a href="https://redirect.github.com/markedjs/marked/issues/4123">#4123</a>)</li> <li><a href="https://github.com/markedjs/marked/commit/627d9ae4e5ea403580782a8f6e21fbc8bf56f4c1"><code>627d9ae</code></a> fix: make walkTokens linear by appending values in place (<a href="https://redirect.github.com/markedjs/marked/issues/4121">#4121</a>)</li> <li><a href="https://github.com/markedjs/marked/commit/4bd252811fb24ca6b7e22f60c39b89efc2b265d2"><code>4bd2528</code></a> fix: respect tab stops in list continuation indentation (<a href="https://redirect.github.com/markedjs/marked/issues/4119">#4119</a>)</li> <li><a href="https://github.com/markedjs/marked/commit/9e64a6a3fe6b826d113fc337c21ebe345455a842"><code>9e64a6a</code></a> fix: end blockquote before a lazy line after a heading, hr or html block (<a href="https://redirect.github.com/markedjs/marked/issues/4115">#4115</a>)</li> <li>Additional commits viewable in <a href="https://github.com/markedjs/marked/compare/v18.1.0...v18.1.1">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
….22.0 (#998) Bumps [github.com/nicholas-fedor/shoutrrr](https://github.com/nicholas-fedor/shoutrrr) from 0.21.2 to 0.22.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/nicholas-fedor/shoutrrr/releases">github.com/nicholas-fedor/shoutrrr's releases</a>.</em></p> <blockquote> <h2>v0.22.0</h2> <h2>Upgrade Notes</h2> <ul> <li>Router results from <code>Send</code>, <code>SendContext</code>, <code>SendItems</code>, and <code>SendItemsContext</code> now line up with the configured URLs, and each failure is a <code>*types.TargetError</code> whose <code>Index</code> field gives the URL's position.</li> <li>Errors and logs no longer contain service URLs or credentials. Errors keep the scheme and host, and the underlying cause text is unchanged.</li> <li><code>shoutrrr.Send</code> now runs through a one-shot router, so each service's send budget applies (10 seconds by default) and the service is closed afterwards.</li> <li>Undeclared <code>title</code>, <code>message</code>, and <code>level</code> params are now accepted instead of failing the send, and params no longer change a service's stored config between sends.</li> <li>Matrix logs in on the first send instead of during initialization, so creating a sender to validate a URL no longer contacts the server.</li> <li>MQTT keeps its connection open between sends, disconnects after 60 seconds idle, and disconnects when the sender is closed. Call <code>Close</code> on long-lived senders when you are done with them.</li> <li>Default HTTP clients now honor the <code>HTTP_PROXY</code>, <code>HTTPS_PROXY</code>, and <code>NO_PROXY</code> environment variables, and the generic service's default client has a 10 second timeout.</li> <li>The CLI reads every flag from a <code>SHOUTRRR_<FLAG></code> environment variable. Positional arguments no longer override flags, and extra arguments are an error.</li> <li><code>CreateSender</code>, <code>NewSender</code>, <code>router.New</code>, the <code>SendWithContext</code> methods, bark's <code>SendItems</code>, and <code>jsonclient.NewClient</code> are deprecated. Run <code>go fix ./...</code> to migrate callers.</li> </ul> <h2>Features</h2> <ul> <li>feat: add context-aware sends and closing to the router and root API by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1464">nicholas-fedor/shoutrrr#1464</a></li> <li>feat: add context-aware sends to json client services by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1469">nicholas-fedor/shoutrrr#1469</a></li> <li>feat: add context-aware sends to the push services by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1510">nicholas-fedor/shoutrrr#1510</a></li> <li>feat: add context-aware sends to the chat webhook services by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1512">nicholas-fedor/shoutrrr#1512</a></li> <li>feat: add context-aware sends to the remaining services by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1516">nicholas-fedor/shoutrrr#1516</a></li> <li>chore: let go fix migrate the remaining deprecated constructors by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1527">nicholas-fedor/shoutrrr#1527</a></li> </ul> <h2>Fixes</h2> <ul> <li>fix(router): stop custom url panic and url leaks by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1422">nicholas-fedor/shoutrrr#1422</a></li> <li>fix(router): return send errors in url order by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1424">nicholas-fedor/shoutrrr#1424</a></li> <li>fix(util): keep lines intact when batching messages by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1426">nicholas-fedor/shoutrrr#1426</a></li> <li>fix(discord): count the title toward each batch's embed limit by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1428">nicholas-fedor/shoutrrr#1428</a></li> <li>fix(format): accept reserved params that a service does not declare by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1430">nicholas-fedor/shoutrrr#1430</a></li> <li>fix: redact service urls from errors by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1432">nicholas-fedor/shoutrrr#1432</a></li> <li>fix(services): redact credentials from service errors and logs by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1441">nicholas-fedor/shoutrrr#1441</a></li> <li>fix(services): keep http client injection safe and authenticated by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1443">nicholas-fedor/shoutrrr#1443</a></li> <li>fix(telegram): report failed requests instead of success by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1445">nicholas-fedor/shoutrrr#1445</a></li> <li>fix(matrix): log in on first send instead of during initialize by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1447">nicholas-fedor/shoutrrr#1447</a></li> <li>fix(mqtt): keep connections open between sends and close them when idle by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1451">nicholas-fedor/shoutrrr#1451</a></li> <li>fix(services): apply send params to a per-send config copy by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1455">nicholas-fedor/shoutrrr#1455</a></li> <li>fix(services): match the capability interfaces the router dispatches on by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1459">nicholas-fedor/shoutrrr#1459</a></li> <li>fix: honor proxy environment variables in default http clients by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1479">nicholas-fedor/shoutrrr#1479</a></li> <li>fix(cli): read every flag from the environment and stop prompts at end of input by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1481">nicholas-fedor/shoutrrr#1481</a></li> <li>fix(cli): close services after sending so MQTT disconnects cleanly by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1508">nicholas-fedor/shoutrrr#1508</a></li> <li>fix: restore the default client when a nil *http.Client is set by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1518">nicholas-fedor/shoutrrr#1518</a></li> <li>fix(join): send the icon without requiring a title by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1525">nicholas-fedor/shoutrrr#1525</a></li> </ul> <h2>Dependency Updates</h2> <ul> <li>chore(deps): update go toolchain directive to v1.27.2 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1453">nicholas-fedor/shoutrrr#1453</a></li> <li>fix(deps): update module github.com/onsi/ginkgo/v2 to v2.33.1 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1505">nicholas-fedor/shoutrrr#1505</a></li> <li>fix(deps): update module github.com/mattn/go-colorable to v0.1.16 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1414">nicholas-fedor/shoutrrr#1414</a></li> <li>chore(deps): update module github.com/stretchr/objx to v0.7.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1547">nicholas-fedor/shoutrrr#1547</a></li> <li>chore(deps): update module golang.org/x/crypto to v0.58.0 by <a href="https://github.com/renovate"><code>@renovate</code></a>[bot] in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1499">nicholas-fedor/shoutrrr#1499</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/nicholas-fedor/shoutrrr/blob/main/CHANGELOG.md">github.com/nicholas-fedor/shoutrrr's changelog</a>.</em></p> <blockquote> <h2>[0.22.0] - 2026-10-13</h2> <h3>Added</h3> <ul> <li>Add context-aware sends to the remaining services by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1516">#1516</a></li> <li>Add context-aware sends to the chat webhook services by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1512">#1512</a></li> <li>Add context-aware sends to the push services by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1510">#1510</a></li> <li>Add context-aware sends to json client services by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1469">#1469</a></li> <li>Add context-aware sends and closing to the router and root API by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1464">#1464</a></li> </ul> <h3>Fixed</h3> <ul> <li>Send the icon without requiring a title by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1525">#1525</a></li> <li>Restore the default client when a nil *http.Client is set by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1518">#1518</a></li> <li>Close services after sending so MQTT disconnects cleanly by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1508">#1508</a></li> <li>Read every flag from the environment and stop prompts at end of input by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1481">#1481</a></li> <li>Honor proxy environment variables in default http clients by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1479">#1479</a></li> <li>Match the capability interfaces the router dispatches on by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1459">#1459</a></li> <li>Apply send params to a per-send config copy by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1455">#1455</a></li> <li>Keep connections open between sends and close them when idle by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1451">#1451</a></li> <li>Log in on first send instead of during initialize by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1447">#1447</a></li> <li>Report failed requests instead of success by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1445">#1445</a></li> <li>Keep http client injection safe and authenticated by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1443">#1443</a></li> <li>Redact credentials from service errors and logs by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1441">#1441</a></li> <li>Redact service urls from errors by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1432">#1432</a></li> <li>Accept reserved params that a service does not declare by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1430">#1430</a></li> <li>Count the title toward each batch's embed limit by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1428">#1428</a></li> <li>Keep lines intact when batching messages by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1426">#1426</a></li> <li>Return send errors in url order by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1424">#1424</a></li> <li>Stop custom url panic and url leaks by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1422">#1422</a></li> </ul> <h3>Documentation</h3> <ul> <li>Fix drift in the readme, docker, service, and package docs by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1520">#1520</a></li> <li>Document SendContext for per-send params by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1487">#1487</a></li> </ul> <h3>Tests</h3> <ul> <li>Stop unit tests from sending dns queries by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1466">#1466</a></li> <li>Type generator input before starting generate by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1457">#1457</a></li> <li>Add cross-service contract suite by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1418">#1418</a></li> <li>Fix data races and run tests with the race detector by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1416">#1416</a></li> </ul> <h3>Continuous Integration</h3> <ul> <li>Skip commit lint on changelog-only pull requests by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1514">#1514</a></li> <li>Add timeouts, PR concurrency, and module and release config checks by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1501">#1501</a></li> <li>Keep the write token out of the docs build by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1489">#1489</a></li> <li>Fix bot merges and group entries by commit type by <a href="https://github.com/nicholas-fedor"><code>@nicholas-fedor</code></a> in <a href="https://redirect.github.com/nicholas-fedor/shoutrrr/pull/1468">#1468</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/nicholas-fedor/shoutrrr/commit/017cbd3c39dd31bfe60171e17545cf8007fc9575"><code>017cbd3</code></a> docs(changelog): update changelog (<a href="https://redirect.github.com/nicholas-fedor/shoutrrr/issues/1548">#1548</a>)</li> <li><a href="https://github.com/nicholas-fedor/shoutrrr/commit/99a1929f3160d0224f6de0a71fb2946740334032"><code>99a1929</code></a> chore(deps): update module github.com/stretchr/objx to v0.7.0 (<a href="https://redirect.github.com/nicholas-fedor/shoutrrr/issues/1547">#1547</a>)</li> <li><a href="https://github.com/nicholas-fedor/shoutrrr/commit/1bad90546aeba481d65058054d1b9261e1ab69ff"><code>1bad905</code></a> chore(deps): update goreleaser/goreleaser-action action to v7.3.0 (<a href="https://redirect.github.com/nicholas-fedor/shoutrrr/issues/1546">#1546</a>)</li> <li><a href="https://github.com/nicholas-fedor/shoutrrr/commit/088541d0d1cb272d7db142a7c9487fa0462f89a1"><code>088541d</code></a> docs(changelog): update changelog (<a href="https://redirect.github.com/nicholas-fedor/shoutrrr/issues/1543">#1543</a>)</li> <li><a href="https://github.com/nicholas-fedor/shoutrrr/commit/8e798b4079102afe667ef25fabfad89cfc609d58"><code>8e798b4</code></a> chore(deps): update dependency verspec to v0.2.0 (<a href="https://redirect.github.com/nicholas-fedor/shoutrrr/issues/1545">#1545</a>)</li> <li><a href="https://github.com/nicholas-fedor/shoutrrr/commit/ae7c3e2773901f32a1bc41a062feaddbfeb8571f"><code>ae7c3e2</code></a> chore(deps): update nicholas-fedor/govulncheck-action action to v1.1.1 (<a href="https://redirect.github.com/nicholas-fedor/shoutrrr/issues/1544">#1544</a>)</li> <li><a href="https://github.com/nicholas-fedor/shoutrrr/commit/00986b0e2c82fd81b4e00e963b83001e3647cc42"><code>00986b0</code></a> docs(changelog): update changelog (<a href="https://redirect.github.com/nicholas-fedor/shoutrrr/issues/1542">#1542</a>)</li> <li><a href="https://github.com/nicholas-fedor/shoutrrr/commit/f0f79fb585422a65064c2e95b3767d71ba20625b"><code>f0f79fb</code></a> chore(deps): update github.com/google/pprof digest to 2af12c3 (<a href="https://redirect.github.com/nicholas-fedor/shoutrrr/issues/1541">#1541</a>)</li> <li><a href="https://github.com/nicholas-fedor/shoutrrr/commit/18598fcc7110b69746b3928bf066bc6465fcab54"><code>18598fc</code></a> chore(deps): update binwiederhier/ntfy:latest docker digest to 8563a39 (<a href="https://redirect.github.com/nicholas-fedor/shoutrrr/issues/1540">#1540</a>)</li> <li><a href="https://github.com/nicholas-fedor/shoutrrr/commit/e8be763aa5611f68d1aa1a864a567b82dad5679f"><code>e8be763</code></a> docs(changelog): update changelog (<a href="https://redirect.github.com/nicholas-fedor/shoutrrr/issues/1539">#1539</a>)</li> <li>Additional commits viewable in <a href="https://github.com/nicholas-fedor/shoutrrr/compare/v0.21.2...v0.22.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…es (#999) Bumps the angular group in /webapp/frontend with 19 updates: | Package | From | To | | --- | --- | --- | | [@angular-eslint/schematics](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/schematics) | `22.5.0` | `22.6.0` | | [@angular/animations](https://github.com/angular/angular/tree/HEAD/packages/animations) | `22.2.2` | `22.2.3` | | [@angular/cdk](https://github.com/angular/components) | `22.2.2` | `22.2.3` | | [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) | `22.2.2` | `22.2.3` | | [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) | `22.2.2` | `22.2.3` | | [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) | `22.2.2` | `22.2.3` | | [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) | `22.2.2` | `22.2.3` | | [@angular/material](https://github.com/angular/components) | `22.2.2` | `22.2.3` | | [@angular/platform-browser](https://github.com/angular/angular/tree/HEAD/packages/platform-browser) | `22.2.2` | `22.2.3` | | [@angular/platform-browser-dynamic](https://github.com/angular/angular/tree/HEAD/packages/platform-browser-dynamic) | `22.2.2` | `22.2.3` | | [@angular/router](https://github.com/angular/angular/tree/HEAD/packages/router) | `22.2.2` | `22.2.3` | | [@angular-eslint/builder](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/builder) | `22.5.0` | `22.6.0` | | [@angular-eslint/eslint-plugin](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin) | `22.5.0` | `22.6.0` | | [@angular-eslint/eslint-plugin-template](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin-template) | `22.5.0` | `22.6.0` | | [@angular-eslint/template-parser](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/template-parser) | `22.5.0` | `22.6.0` | | [@angular/build](https://github.com/angular/angular-cli) | `22.2.2` | `22.2.3` | | [@angular/cli](https://github.com/angular/angular-cli) | `22.2.2` | `22.2.3` | | [@angular/compiler-cli](https://github.com/angular/angular/tree/HEAD/packages/compiler-cli) | `22.2.2` | `22.2.3` | | [@angular/language-service](https://github.com/angular/angular/tree/HEAD/packages/language-service) | `22.2.2` | `22.2.3` | Updates `@angular-eslint/schematics` from 22.5.0 to 22.6.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/angular-eslint/angular-eslint/releases">@angular-eslint/schematics's releases</a>.</em></p> <blockquote> <h2>v22.6.0</h2> <h2>22.6.0 (2026-10-11)</h2> <h3>🚀 Features</h3> <ul> <li><strong>eslint-plugin:</strong> [prefer-standalone] add allowExplicitStandalone option (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3237">#3237</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li>update dependency <code>@angular/compiler</code> to v22.1.5 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3205">#3205</a>)</li> <li>update dependency <code>@angular/compiler</code> to v22.1.6 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3217">#3217</a>)</li> <li>update dependency eslint to v10.10.0 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3209">#3209</a>)</li> <li>update typescript-eslint packages to v8.70.0 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3212">#3212</a>)</li> <li>update dependency <code>@angular/compiler</code> to v22.1.7 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3230">#3230</a>)</li> <li>update dependency eslint to v10.11.0 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3233">#3233</a>)</li> <li>update typescript-eslint packages to v8.70.1 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3244">#3244</a>)</li> <li>update dependency <code>@angular/compiler</code> to v22.2.0 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3247">#3247</a>)</li> <li>update typescript-eslint packages to v8.71.0 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3258">#3258</a>)</li> <li>update dependency <code>@angular/compiler</code> to v22.2.1 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3264">#3264</a>)</li> <li>update dependency eslint to v10.12.0 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3274">#3274</a>)</li> <li><strong>eslint-plugin:</strong> [reactive-context-must-read-signal] ignore inherited primitive names (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3201">#3201</a>)</li> <li><strong>eslint-plugin:</strong> ensure <code>prefix</code> rule option schema is fully typed (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3246">#3246</a>)</li> <li><strong>eslint-plugin:</strong> [prefer-signal-model] rewrite the emit calls of the removed output (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3200">#3200</a>)</li> <li><strong>eslint-plugin-template:</strong> [conditional-complexity] check control flow (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3260">#3260</a>)</li> <li><strong>template-parser:</strong> traverse <a href="https://github.com/defer"><code>@defer</code></a> hydrate triggers (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3231">#3231</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Andrew Kazakov <a href="https://github.com/andreww2012"><code>@andreww2012</code></a></li> <li>Daniel Pinto <a href="https://github.com/Cayan"><code>@Cayan</code></a></li> <li>Guillaume DROUARD</li> <li>Michael Doyle <a href="https://github.com/MichaelDoyle"><code>@MichaelDoyle</code></a></li> <li>Максим Иванов</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/angular-eslint/angular-eslint/blob/main/packages/schematics/CHANGELOG.md">@angular-eslint/schematics's changelog</a>.</em></p> <blockquote> <h2>22.6.0 (2026-10-11)</h2> <p>This was a version bump only for schematics to align it with other projects, there were no code changes.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/angular-eslint/angular-eslint/commit/7722ad2ab4da81568f19a7a29a3951fa443bf22c"><code>7722ad2</code></a> chore(release): publish 22.6.0</li> <li><a href="https://github.com/angular-eslint/angular-eslint/commit/6c37ac78baed857b9b3a554121860be612e7488a"><code>6c37ac7</code></a> chore: update nx monorepo to v23.2.0 (<a href="https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/schematics/issues/3202">#3202</a>)</li> <li>See full diff in <a href="https://github.com/angular-eslint/angular-eslint/commits/v22.6.0/packages/schematics">compare view</a></li> </ul> </details> <br /> Updates `@angular/animations` from 22.2.2 to 22.2.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/angular/angular/releases">@angular/animations's releases</a>.</em></p> <blockquote> <h2>22.2.3</h2> <h3>common</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/fafec77b5d4e6dfc89aad72db9c132d3dfe46ba6"><img src="https://img.shields.io/badge/fafec77b5d-fix-green" alt="fix - fafec77b5d" /></a></td> <td>harden param encoding against prototype pollution</td> </tr> </tbody> </table> <h3>compiler</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/54f3de517c2e4cda264eca5f2d143a1f6967c7a9"><img src="https://img.shields.io/badge/54f3de517c-fix-green" alt="fix - 54f3de517c" /></a></td> <td>check <code>@boundary</code> blocks in the control flow content projection diagnostic</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/5e50658fd23983dd27ef89a67cea26910af6fd79"><img src="https://img.shields.io/badge/5e50658fd2-fix-green" alt="fix - 5e50658fd2" /></a></td> <td>compare the operand in ReadTemporaryExpr.isEquivalent</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/b6f9cc5d7013f8f136b38cccfe486264200f04f5"><img src="https://img.shields.io/badge/b6f9cc5d70-fix-green" alt="fix - b6f9cc5d70" /></a></td> <td>do not scope comments placed inside of a selector</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/35a02f8097724f4b6e83e1c9c008da8f1fc7f127"><img src="https://img.shields.io/badge/35a02f8097-fix-green" alt="fix - 35a02f8097" /></a></td> <td>harden JIT against prototype pollution</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/08075e8aa03800bc1b8ae793fb3d52761cdd28b6"><img src="https://img.shields.io/badge/08075e8aa0-fix-green" alt="fix - 08075e8aa0" /></a></td> <td>support dots in class binding names</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/c7a72c2bf2213d881496e70933fc61bdaaa00621"><img src="https://img.shields.io/badge/c7a72c2bf2-fix-green" alt="fix - c7a72c2bf2" /></a></td> <td>support popover property bindings</td> </tr> </tbody> </table> <h3>compiler-cli</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/fa21d083fe92e67a2a070059b850b9a32a08cef9"><img src="https://img.shields.io/badge/fa21d083fe-fix-green" alt="fix - fa21d083fe" /></a></td> <td>inline tcb when depending on local directive</td> </tr> </tbody> </table> <h3>core</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/b5208f9fc3a77a9631c2f38c30c38c777a642839"><img src="https://img.shields.io/badge/b5208f9fc3-fix-green" alt="fix - b5208f9fc3" /></a></td> <td>avoid deleting idle bucket created during another bucket's drain</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/90af679c3b585515651b138667b8eaf3df652968"><img src="https://img.shields.io/badge/90af679c3b-fix-green" alt="fix - 90af679c3b" /></a></td> <td>do not swallow compilation errors in computeStandaloneComponentScope</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/eca5fa466508ef68014cbebb0cafd63947f9eda7"><img src="https://img.shields.io/badge/eca5fa4665-fix-green" alt="fix - eca5fa4665" /></a></td> <td>don't crash initEventReplay when two apps share an APP_ID</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/e59a2303dfb4f3242552d382bbeebf6a38446856"><img src="https://img.shields.io/badge/e59a2303df-fix-green" alt="fix - e59a2303df" /></a></td> <td>error when destroying embedded view with animations</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/a23941fe7547634c9f1160541b3a2265e284f624"><img src="https://img.shields.io/badge/a23941fe75-fix-green" alt="fix - a23941fe75" /></a></td> <td>keep activeConsumer and currentInjector constant using Store helper</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/913ae7421f609c6ad375219045e9ab3f3b0eba73"><img src="https://img.shields.io/badge/913ae7421f-fix-green" alt="fix - 913ae7421f" /></a></td> <td>skip nested tick from onMicrotaskEmpty while a tick is running</td> </tr> </tbody> </table> <h3>forms</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/cc515b8b2331df643e7ff80915efc402bc97d3bb"><img src="https://img.shields.io/badge/cc515b8b23-perf-orange" alt="perf - cc515b8b23" /></a></td> <td>use addEventListener to avoid unconditional CD scheduling on blur</td> </tr> </tbody> </table> <h3>migrations</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/d04f214d04678f0dbb0b769a53d1f15ece09c4a2"><img src="https://img.shields.io/badge/d04f214d04-fix-green" alt="fix - d04f214d04" /></a></td> <td>normalize .d.ts paths in output migration field IDs</td> </tr> </tbody> </table> <h3>router</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/f9a4f751f0ad0f3f22d49430475d6d57fa29fd3f"><img src="https://img.shields.io/badge/f9a4f751f0-fix-green" alt="fix - f9a4f751f0" /></a></td> <td>check abort signal state on subscribe</td> </tr> </tbody> </table> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/angular/angular/commits/v22.2.3/packages/animations">compare view</a></li> </ul> </details> <br /> Updates `@angular/cdk` from 22.2.2 to 22.2.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/angular/components/releases">@angular/cdk's releases</a>.</em></p> <blockquote> <h2>22.2.3</h2> <h3>material</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/components/commit/e0c2d4df72a673d6bcab027aa4db78f2f7ec9af1"><img src="https://img.shields.io/badge/e0c2d4df7-fix-green" alt="fix - e0c2d4df7" /></a></td> <td><strong>chips:</strong> implement touch-target pattern/styles on chip component (<a href="https://redirect.github.com/angular/components/issues/33614">#33614</a>)</td> </tr> </tbody> </table> <h3>cdk</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/components/commit/a307978dc42c034ed8a13a13fce93f6884c69487"><img src="https://img.shields.io/badge/a307978dc-fix-green" alt="fix - a307978dc" /></a></td> <td><strong>a11y:</strong> treat inert elements as non-focusable (<a href="https://redirect.github.com/angular/components/issues/33846">#33846</a>)</td> </tr> </tbody> </table> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/angular/components/blob/main/CHANGELOG.md">@angular/cdk's changelog</a>.</em></p> <blockquote> <h1>22.2.3 "rhenium-rotor" (2026-10-14)</h1> <h3>cdk</h3> <table> <thead> <tr> <th>Commit</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/components/commit/a307978dc42c034ed8a13a13fce93f6884c69487">a307978dc</a></td> <td>fix</td> <td><strong>a11y:</strong> treat inert elements as non-focusable (<a href="https://redirect.github.com/angular/components/pull/33846">#33846</a>)</td> </tr> </tbody> </table> <h3>material</h3> <table> <thead> <tr> <th>Commit</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/components/commit/e0c2d4df72a673d6bcab027aa4db78f2f7ec9af1">e0c2d4df7</a></td> <td>fix</td> <td><strong>chips:</strong> implement touch-target pattern/styles on chip component (<a href="https://redirect.github.com/angular/components/pull/33614">#33614</a>)</td> </tr> </tbody> </table> <!-- raw HTML omitted --> <p><!-- raw HTML omitted --><!-- raw HTML omitted --></p> <h1>22.3.0-next.1 "calcium-crown" (2026-10-07)</h1> <h3>cdk</h3> <table> <thead> <tr> <th>Commit</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/components/commit/cc3829f624b523d05397cf2d66c5e3d054070d0c">cc3829f62</a></td> <td>fix</td> <td><strong>drag-drop:</strong> remove old prefixes for fullscreen elements</td> </tr> <tr> <td><a href="https://github.com/angular/components/commit/84a2366bb1b0912dcdb6f767c9507a5ee1cc916f">84a2366bb</a></td> <td>fix</td> <td><strong>drag-drop:</strong> use consistent touch coordinates for bounded dragging (<a href="https://redirect.github.com/angular/components/pull/33928">#33928</a>)</td> </tr> <tr> <td><a href="https://github.com/angular/components/commit/f6c2a193ec4ad454beeafc74469103fecfc96a12">f6c2a193e</a></td> <td>fix</td> <td><strong>overlay:</strong> remove old prefixes for fullscreen elements</td> </tr> </tbody> </table> <h3>material</h3> <table> <thead> <tr> <th>Commit</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/components/commit/cffa9cfea89ec1f1ec32295a5d1670172db4b653">cffa9cfea</a></td> <td>fix</td> <td><strong>icon:</strong> do not copy event attributes (<a href="https://redirect.github.com/angular/components/pull/33929">#33929</a>)</td> </tr> </tbody> </table> <h3>google-maps</h3> <table> <thead> <tr> <th>Commit</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/components/commit/52a1ef36c68c763656aeb070bfa9b7fa24905894">52a1ef36c</a></td> <td>fix</td> <td>use console.error instead of hard error (<a href="https://redirect.github.com/angular/components/pull/33917">#33917</a>)</td> </tr> </tbody> </table> <!-- raw HTML omitted --> <p><!-- raw HTML omitted --><!-- raw HTML omitted --></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/angular/components/commit/7c47fa5aa85eebeb10d0d28c6c60cc3bf92fd5e4"><code>7c47fa5</code></a> release: cut the v22.2.3 release</li> <li><a href="https://github.com/angular/components/commit/a307978dc42c034ed8a13a13fce93f6884c69487"><code>a307978</code></a> fix(cdk/a11y): treat inert elements as non-focusable (<a href="https://redirect.github.com/angular/components/issues/33846">#33846</a>)</li> <li><a href="https://github.com/angular/components/commit/01b48b1c9a6785ade74f1d5009afc8ef1f1829f6"><code>01b48b1</code></a> build: ban new usages of fakeAsync (<a href="https://redirect.github.com/angular/components/issues/33946">#33946</a>)</li> <li><a href="https://github.com/angular/components/commit/e0c2d4df72a673d6bcab027aa4db78f2f7ec9af1"><code>e0c2d4d</code></a> fix(material/chips): implement touch-target pattern/styles on chip component ...</li> <li>See full diff in <a href="https://github.com/angular/components/compare/v22.2.2...v22.2.3">compare view</a></li> </ul> </details> <br /> Updates `@angular/common` from 22.2.2 to 22.2.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/angular/angular/releases">@angular/common's releases</a>.</em></p> <blockquote> <h2>22.2.3</h2> <h3>common</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/fafec77b5d4e6dfc89aad72db9c132d3dfe46ba6"><img src="https://img.shields.io/badge/fafec77b5d-fix-green" alt="fix - fafec77b5d" /></a></td> <td>harden param encoding against prototype pollution</td> </tr> </tbody> </table> <h3>compiler</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/54f3de517c2e4cda264eca5f2d143a1f6967c7a9"><img src="https://img.shields.io/badge/54f3de517c-fix-green" alt="fix - 54f3de517c" /></a></td> <td>check <code>@boundary</code> blocks in the control flow content projection diagnostic</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/5e50658fd23983dd27ef89a67cea26910af6fd79"><img src="https://img.shields.io/badge/5e50658fd2-fix-green" alt="fix - 5e50658fd2" /></a></td> <td>compare the operand in ReadTemporaryExpr.isEquivalent</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/b6f9cc5d7013f8f136b38cccfe486264200f04f5"><img src="https://img.shields.io/badge/b6f9cc5d70-fix-green" alt="fix - b6f9cc5d70" /></a></td> <td>do not scope comments placed inside of a selector</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/35a02f8097724f4b6e83e1c9c008da8f1fc7f127"><img src="https://img.shields.io/badge/35a02f8097-fix-green" alt="fix - 35a02f8097" /></a></td> <td>harden JIT against prototype pollution</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/08075e8aa03800bc1b8ae793fb3d52761cdd28b6"><img src="https://img.shields.io/badge/08075e8aa0-fix-green" alt="fix - 08075e8aa0" /></a></td> <td>support dots in class binding names</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/c7a72c2bf2213d881496e70933fc61bdaaa00621"><img src="https://img.shields.io/badge/c7a72c2bf2-fix-green" alt="fix - c7a72c2bf2" /></a></td> <td>support popover property bindings</td> </tr> </tbody> </table> <h3>compiler-cli</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/fa21d083fe92e67a2a070059b850b9a32a08cef9"><img src="https://img.shields.io/badge/fa21d083fe-fix-green" alt="fix - fa21d083fe" /></a></td> <td>inline tcb when depending on local directive</td> </tr> </tbody> </table> <h3>core</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/b5208f9fc3a77a9631c2f38c30c38c777a642839"><img src="https://img.shields.io/badge/b5208f9fc3-fix-green" alt="fix - b5208f9fc3" /></a></td> <td>avoid deleting idle bucket created during another bucket's drain</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/90af679c3b585515651b138667b8eaf3df652968"><img src="https://img.shields.io/badge/90af679c3b-fix-green" alt="fix - 90af679c3b" /></a></td> <td>do not swallow compilation errors in computeStandaloneComponentScope</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/eca5fa466508ef68014cbebb0cafd63947f9eda7"><img src="https://img.shields.io/badge/eca5fa4665-fix-green" alt="fix - eca5fa4665" /></a></td> <td>don't crash initEventReplay when two apps share an APP_ID</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/e59a2303dfb4f3242552d382bbeebf6a38446856"><img src="https://img.shields.io/badge/e59a2303df-fix-green" alt="fix - e59a2303df" /></a></td> <td>error when destroying embedded view with animations</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/a23941fe7547634c9f1160541b3a2265e284f624"><img src="https://img.shields.io/badge/a23941fe75-fix-green" alt="fix - a23941fe75" /></a></td> <td>keep activeConsumer and currentInjector constant using Store helper</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/913ae7421f609c6ad375219045e9ab3f3b0eba73"><img src="https://img.shields.io/badge/913ae7421f-fix-green" alt="fix - 913ae7421f" /></a></td> <td>skip nested tick from onMicrotaskEmpty while a tick is running</td> </tr> </tbody> </table> <h3>forms</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/cc515b8b2331df643e7ff80915efc402bc97d3bb"><img src="https://img.shields.io/badge/cc515b8b23-perf-orange" alt="perf - cc515b8b23" /></a></td> <td>use addEventListener to avoid unconditional CD scheduling on blur</td> </tr> </tbody> </table> <h3>migrations</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/d04f214d04678f0dbb0b769a53d1f15ece09c4a2"><img src="https://img.shields.io/badge/d04f214d04-fix-green" alt="fix - d04f214d04" /></a></td> <td>normalize .d.ts paths in output migration field IDs</td> </tr> </tbody> </table> <h3>router</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/f9a4f751f0ad0f3f22d49430475d6d57fa29fd3f"><img src="https://img.shields.io/badge/f9a4f751f0-fix-green" alt="fix - f9a4f751f0" /></a></td> <td>check abort signal state on subscribe</td> </tr> </tbody> </table> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/angular/angular/commit/dcb29a9fb03e3b4cd10226571f1bc5043614520a"><code>dcb29a9</code></a> docs: fix <a href="https://github.com/param"><code>@param</code></a> names that don't match their parameters</li> <li><a href="https://github.com/angular/angular/commit/fafec77b5d4e6dfc89aad72db9c132d3dfe46ba6"><code>fafec77</code></a> fix(common): harden param encoding against prototype pollution</li> <li>See full diff in <a href="https://github.com/angular/angular/commits/v22.2.3/packages/common">compare view</a></li> </ul> </details> <br /> Updates `@angular/compiler` from 22.2.2 to 22.2.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/angular/angular/releases">@angular/compiler's releases</a>.</em></p> <blockquote> <h2>22.2.3</h2> <h3>common</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/fafec77b5d4e6dfc89aad72db9c132d3dfe46ba6"><img src="https://img.shields.io/badge/fafec77b5d-fix-green" alt="fix - fafec77b5d" /></a></td> <td>harden param encoding against prototype pollution</td> </tr> </tbody> </table> <h3>compiler</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/54f3de517c2e4cda264eca5f2d143a1f6967c7a9"><img src="https://img.shields.io/badge/54f3de517c-fix-green" alt="fix - 54f3de517c" /></a></td> <td>check <code>@boundary</code> blocks in the control flow content projection diagnostic</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/5e50658fd23983dd27ef89a67cea26910af6fd79"><img src="https://img.shields.io/badge/5e50658fd2-fix-green" alt="fix - 5e50658fd2" /></a></td> <td>compare the operand in ReadTemporaryExpr.isEquivalent</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/b6f9cc5d7013f8f136b38cccfe486264200f04f5"><img src="https://img.shields.io/badge/b6f9cc5d70-fix-green" alt="fix - b6f9cc5d70" /></a></td> <td>do not scope comments placed inside of a selector</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/35a02f8097724f4b6e83e1c9c008da8f1fc7f127"><img src="https://img.shields.io/badge/35a02f8097-fix-green" alt="fix - 35a02f8097" /></a></td> <td>harden JIT against prototype pollution</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/08075e8aa03800bc1b8ae793fb3d52761cdd28b6"><img src="https://img.shields.io/badge/08075e8aa0-fix-green" alt="fix - 08075e8aa0" /></a></td> <td>support dots in class binding names</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/c7a72c2bf2213d881496e70933fc61bdaaa00621"><img src="https://img.shields.io/badge/c7a72c2bf2-fix-green" alt="fix - c7a72c2bf2" /></a></td> <td>support popover property bindings</td> </tr> </tbody> </table> <h3>compiler-cli</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/fa21d083fe92e67a2a070059b850b9a32a08cef9"><img src="https://img.shields.io/badge/fa21d083fe-fix-green" alt="fix - fa21d083fe" /></a></td> <td>inline tcb when depending on local directive</td> </tr> </tbody> </table> <h3>core</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/b5208f9fc3a77a9631c2f38c30c38c777a642839"><img src="https://img.shields.io/badge/b5208f9fc3-fix-green" alt="fix - b5208f9fc3" /></a></td> <td>avoid deleting idle bucket created during another bucket's drain</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/90af679c3b585515651b138667b8eaf3df652968"><img src="https://img.shields.io/badge/90af679c3b-fix-green" alt="fix - 90af679c3b" /></a></td> <td>do not swallow compilation errors in computeStandaloneComponentScope</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/eca5fa466508ef68014cbebb0cafd63947f9eda7"><img src="https://img.shields.io/badge/eca5fa4665-fix-green" alt="fix - eca5fa4665" /></a></td> <td>don't crash initEventReplay when two apps share an APP_ID</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/e59a2303dfb4f3242552d382bbeebf6a38446856"><img src="https://img.shields.io/badge/e59a2303df-fix-green" alt="fix - e59a2303df" /></a></td> <td>error when destroying embedded view with animations</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/a23941fe7547634c9f1160541b3a2265e284f624"><img src="https://img.shields.io/badge/a23941fe75-fix-green" alt="fix - a23941fe75" /></a></td> <td>keep activeConsumer and currentInjector constant using Store helper</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/913ae7421f609c6ad375219045e9ab3f3b0eba73"><img src="https://img.shields.io/badge/913ae7421f-fix-green" alt="fix - 913ae7421f" /></a></td> <td>skip nested tick from onMicrotaskEmpty while a tick is running</td> </tr> </tbody> </table> <h3>forms</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/cc515b8b2331df643e7ff80915efc402bc97d3bb"><img src="https://img.shields.io/badge/cc515b8b23-perf-orange" alt="perf - cc515b8b23" /></a></td> <td>use addEventListener to avoid unconditional CD scheduling on blur</td> </tr> </tbody> </table> <h3>migrations</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/d04f214d04678f0dbb0b769a53d1f15ece09c4a2"><img src="https://img.shields.io/badge/d04f214d04-fix-green" alt="fix - d04f214d04" /></a></td> <td>normalize .d.ts paths in output migration field IDs</td> </tr> </tbody> </table> <h3>router</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/f9a4f751f0ad0f3f22d49430475d6d57fa29fd3f"><img src="https://img.shields.io/badge/f9a4f751f0-fix-green" alt="fix - f9a4f751f0" /></a></td> <td>check abort signal state on subscribe</td> </tr> </tbody> </table> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/angular/angular/commit/54f3de517c2e4cda264eca5f2d143a1f6967c7a9"><code>54f3de5</code></a> fix(compiler): check <code>@boundary</code> blocks in the control flow content projectio...</li> <li><a href="https://github.com/angular/angular/commit/5e50658fd23983dd27ef89a67cea26910af6fd79"><code>5e50658</code></a> fix(compiler): compare the operand in ReadTemporaryExpr.isEquivalent</li> <li><a href="https://github.com/angular/angular/commit/35a02f8097724f4b6e83e1c9c008da8f1fc7f127"><code>35a02f8</code></a> fix(compiler): harden JIT against prototype pollution</li> <li><a href="https://github.com/angular/angular/commit/b6f9cc5d7013f8f136b38cccfe486264200f04f5"><code>b6f9cc5</code></a> fix(compiler): do not scope comments placed inside of a selector</li> <li><a href="https://github.com/angular/angular/commit/08075e8aa03800bc1b8ae793fb3d52761cdd28b6"><code>08075e8</code></a> fix(compiler): support dots in class binding names</li> <li><a href="https://github.com/angular/angular/commit/c7a72c2bf2213d881496e70933fc61bdaaa00621"><code>c7a72c2</code></a> fix(compiler): support popover property bindings</li> <li>See full diff in <a href="https://github.com/angular/angular/commits/v22.2.3/packages/compiler">compare view</a></li> </ul> </details> <br /> Updates `@angular/core` from 22.2.2 to 22.2.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/angular/angular/releases">@angular/core's releases</a>.</em></p> <blockquote> <h2>22.2.3</h2> <h3>common</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/fafec77b5d4e6dfc89aad72db9c132d3dfe46ba6"><img src="https://img.shields.io/badge/fafec77b5d-fix-green" alt="fix - fafec77b5d" /></a></td> <td>harden param encoding against prototype pollution</td> </tr> </tbody> </table> <h3>compiler</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/54f3de517c2e4cda264eca5f2d143a1f6967c7a9"><img src="https://img.shields.io/badge/54f3de517c-fix-green" alt="fix - 54f3de517c" /></a></td> <td>check <code>@boundary</code> blocks in the control flow content projection diagnostic</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/5e50658fd23983dd27ef89a67cea26910af6fd79"><img src="https://img.shields.io/badge/5e50658fd2-fix-green" alt="fix - 5e50658fd2" /></a></td> <td>compare the operand in ReadTemporaryExpr.isEquivalent</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/b6f9cc5d7013f8f136b38cccfe486264200f04f5"><img src="https://img.shields.io/badge/b6f9cc5d70-fix-green" alt="fix - b6f9cc5d70" /></a></td> <td>do not scope comments placed inside of a selector</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/35a02f8097724f4b6e83e1c9c008da8f1fc7f127"><img src="https://img.shields.io/badge/35a02f8097-fix-green" alt="fix - 35a02f8097" /></a></td> <td>harden JIT against prototype pollution</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/08075e8aa03800bc1b8ae793fb3d52761cdd28b6"><img src="https://img.shields.io/badge/08075e8aa0-fix-green" alt="fix - 08075e8aa0" /></a></td> <td>support dots in class binding names</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/c7a72c2bf2213d881496e70933fc61bdaaa00621"><img src="https://img.shields.io/badge/c7a72c2bf2-fix-green" alt="fix - c7a72c2bf2" /></a></td> <td>support popover property bindings</td> </tr> </tbody> </table> <h3>compiler-cli</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/fa21d083fe92e67a2a070059b850b9a32a08cef9"><img src="https://img.shields.io/badge/fa21d083fe-fix-green" alt="fix - fa21d083fe" /></a></td> <td>inline tcb when depending on local directive</td> </tr> </tbody> </table> <h3>core</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/b5208f9fc3a77a9631c2f38c30c38c777a642839"><img src="https://img.shields.io/badge/b5208f9fc3-fix-green" alt="fix - b5208f9fc3" /></a></td> <td>avoid deleting idle bucket created during another bucket's drain</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/90af679c3b585515651b138667b8eaf3df652968"><img src="https://img.shields.io/badge/90af679c3b-fix-green" alt="fix - 90af679c3b" /></a></td> <td>do not swallow compilation errors in computeStandaloneComponentScope</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/eca5fa466508ef68014cbebb0cafd63947f9eda7"><img src="https://img.shields.io/badge/eca5fa4665-fix-green" alt="fix - eca5fa4665" /></a></td> <td>don't crash initEventReplay when two apps share an APP_ID</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/e59a2303dfb4f3242552d382bbeebf6a38446856"><img src="https://img.shields.io/badge/e59a2303df-fix-green" alt="fix - e59a2303df" /></a></td> <td>error when destroying embedded view with animations</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/a23941fe7547634c9f1160541b3a2265e284f624"><img src="https://img.shields.io/badge/a23941fe75-fix-green" alt="fix - a23941fe75" /></a></td> <td>keep activeConsumer and currentInjector constant using Store helper</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/913ae7421f609c6ad375219045e9ab3f3b0eba73"><img src="https://img.shields.io/badge/913ae7421f-fix-green" alt="fix - 913ae7421f" /></a></td> <td>skip nested tick from onMicrotaskEmpty while a tick is running</td> </tr> </tbody> </table> <h3>forms</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/cc515b8b2331df643e7ff80915efc402bc97d3bb"><img src="https://img.shields.io/badge/cc515b8b23-perf-orange" alt="perf - cc515b8b23" /></a></td> <td>use addEventListener to avoid unconditional CD scheduling on blur</td> </tr> </tbody> </table> <h3>migrations</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/d04f214d04678f0dbb0b769a53d1f15ece09c4a2"><img src="https://img.shields.io/badge/d04f214d04-fix-green" alt="fix - d04f214d04" /></a></td> <td>normalize .d.ts paths in output migration field IDs</td> </tr> </tbody> </table> <h3>router</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/f9a4f751f0ad0f3f22d49430475d6d57fa29fd3f"><img src="https://img.shields.io/badge/f9a4f751f0-fix-green" alt="fix - f9a4f751f0" /></a></td> <td>check abort signal state on subscribe</td> </tr> </tbody> </table> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/angular/angular/commit/90af679c3b585515651b138667b8eaf3df652968"><code>90af679</code></a> fix(core): do not swallow compilation errors in computeStandaloneComponentScope</li> <li><a href="https://github.com/angular/angular/commit/eca5fa466508ef68014cbebb0cafd63947f9eda7"><code>eca5fa4</code></a> fix(core): don't crash initEventReplay when two apps share an APP_ID</li> <li><a href="https://github.com/angular/angular/commit/cc515b8b2331df643e7ff80915efc402bc97d3bb"><code>cc515b8</code></a> perf(forms): use addEventListener to avoid unconditional CD scheduling on blur</li> <li><a href="https://github.com/angular/angular/commit/dcb29a9fb03e3b4cd10226571f1bc5043614520a"><code>dcb29a9</code></a> docs: fix <a href="https://github.com/param"><code>@param</code></a> names that don't match their parameters</li> <li><a href="https://github.com/angular/angular/commit/d04f214d04678f0dbb0b769a53d1f15ece09c4a2"><code>d04f214</code></a> fix(migrations): normalize .d.ts paths in output migration field IDs</li> <li><a href="https://github.com/angular/angular/commit/51ce6e53807da3887a5765d38facdcc2b6183248"><code>51ce6e5</code></a> docs: use consistent headers in best-practices.md</li> <li><a href="https://github.com/angular/angular/commit/e59a2303dfb4f3242552d382bbeebf6a38446856"><code>e59a230</code></a> fix(core): error when destroying embedded view with animations</li> <li><a href="https://github.com/angular/angular/commit/08075e8aa03800bc1b8ae793fb3d52761cdd28b6"><code>08075e8</code></a> fix(compiler): support dots in class binding names</li> <li><a href="https://github.com/angular/angular/commit/913ae7421f609c6ad375219045e9ab3f3b0eba73"><code>913ae74</code></a> fix(core): skip nested tick from onMicrotaskEmpty while a tick is running</li> <li><a href="https://github.com/angular/angular/commit/b5208f9fc3a77a9631c2f38c30c38c777a642839"><code>b5208f9</code></a> fix(core): avoid deleting idle bucket created during another bucket's drain</li> <li>Additional commits viewable in <a href="https://github.com/angular/angular/commits/v22.2.3/packages/core">compare view</a></li> </ul> </details> <br /> Updates `@angular/forms` from 22.2.2 to 22.2.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/angular/angular/releases">@angular/forms's releases</a>.</em></p> <blockquote> <h2>22.2.3</h2> <h3>common</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/fafec77b5d4e6dfc89aad72db9c132d3dfe46ba6"><img src="https://img.shields.io/badge/fafec77b5d-fix-green" alt="fix - fafec77b5d" /></a></td> <td>harden param encoding against prototype pollution</td> </tr> </tbody> </table> <h3>compiler</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/54f3de517c2e4cda264eca5f2d143a1f6967c7a9"><img src="https://img.shields.io/badge/54f3de517c-fix-green" alt="fix - 54f3de517c" /></a></td> <td>check <code>@boundary</code> blocks in the control flow content projection diagnostic</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/5e50658fd23983dd27ef89a67cea26910af6fd79"><img src="https://img.shields.io/badge/5e50658fd2-fix-green" alt="fix - 5e50658fd2" /></a></td> <td>compare the operand in ReadTemporaryExpr.isEquivalent</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/b6f9cc5d7013f8f136b38cccfe486264200f04f5"><img src="https://img.shields.io/badge/b6f9cc5d70-fix-green" alt="fix - b6f9cc5d70" /></a></td> <td>do not scope comments placed inside of a selector</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/35a02f8097724f4b6e83e1c9c008da8f1fc7f127"><img src="https://img.shields.io/badge/35a02f8097-fix-green" alt="fix - 35a02f8097" /></a></td> <td>harden JIT against prototype pollution</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/08075e8aa03800bc1b8ae793fb3d52761cdd28b6"><img src="https://img.shields.io/badge/08075e8aa0-fix-green" alt="fix - 08075e8aa0" /></a></td> <td>support dots in class binding names</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/c7a72c2bf2213d881496e70933fc61bdaaa00621"><img src="https://img.shields.io/badge/c7a72c2bf2-fix-green" alt="fix - c7a72c2bf2" /></a></td> <td>support popover property bindings</td> </tr> </tbody> </table> <h3>compiler-cli</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/fa21d083fe92e67a2a070059b850b9a32a08cef9"><img src="https://img.shields.io/badge/fa21d083fe-fix-green" alt="fix - fa21d083fe" /></a></td> <td>inline tcb when depending on local directive</td> </tr> </tbody> </table> <h3>core</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/b5208f9fc3a77a9631c2f38c30c38c777a642839"><img src="https://img.shields.io/badge/b5208f9fc3-fix-green" alt="fix - b5208f9fc3" /></a></td> <td>avoid deleting idle bucket created during another bucket's drain</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/90af679c3b585515651b138667b8eaf3df652968"><img src="https://img.shields.io/badge/90af679c3b-fix-green" alt="fix - 90af679c3b" /></a></td> <td>do not swallow compilation errors in computeStandaloneComponentScope</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/eca5fa466508ef68014cbebb0cafd63947f9eda7"><img src="https://img.shields.io/badge/eca5fa4665-fix-green" alt="fix - eca5fa4665" /></a></td> <td>don't crash initEventReplay when two apps share an APP_ID</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/e59a2303dfb4f3242552d382bbeebf6a38446856"><img src="https://img.shields.io/badge/e59a2303df-fix-green" alt="fix - e59a2303df" /></a></td> <td>error when destroying embedded view with animations</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/a23941fe7547634c9f1160541b3a2265e284f624"><img src="https://img.shields.io/badge/a23941fe75-fix-green" alt="fix - a23941fe75" /></a></td> <td>keep activeConsumer and currentInjector constant using Store helper</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/913ae7421f609c6ad375219045e9ab3f3b0eba73"><img src="https://img.shields.io/badge/913ae7421f-fix-green" alt="fix - 913ae7421f" /></a></td> <td>skip nested tick from onMicrotaskEmpty while a tick is running</td> </tr> </tbody> </table> <h3>forms</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/cc515b8b2331df643e7ff80915efc402bc97d3bb"><img src="https://img.shields.io/badge/cc515b8b23-perf-orange" alt="perf - cc515b8b23" /></a></td> <td>use addEventListener to avoid unconditional CD scheduling on blur</td> </tr> </tbody> </table> <h3>migrations</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/d04f214d04678f0dbb0b769a53d1f15ece09c4a2"><img src="https://img.shields.io/badge/d04f214d04-fix-green" alt="fix - d04f214d04" /></a></td> <td>normalize .d.ts paths in output migration field IDs</td> </tr> </tbody> </table> <h3>router</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/f9a4f751f0ad0f3f22d49430475d6d57fa29fd3f"><img src="https://img.shields.io/badge/f9a4f751f0-fix-green" alt="fix - f9a4f751f0" /></a></td> <td>check abort signal state on subscribe</td> </tr> </tbody> </table> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/angular/angular/commit/cc515b8b2331df643e7ff80915efc402bc97d3bb"><code>cc515b8</code></a> perf(forms): use addEventListener to avoid unconditional CD scheduling on blur</li> <li><a href="https://github.com/angular/angular/commit/dcb29a9fb03e3b4cd10226571f1bc5043614520a"><code>dcb29a9</code></a> docs: fix <a href="https://github.com/param"><code>@param</code></a> names that don't match their parameters</li> <li><a href="https://github.com/angular/angular/commit/276248ff3d93caa3d170edda90a0b9ee706ad7ad"><code>276248f</code></a> docs(forms): document that minDate and maxDate expect UTC dates</li> <li><a href="https://github.com/angular/angular/commit/26279ed4f1cbacf947c743bebac80398eeef5989"><code>26279ed</code></a> test(forms): cover the deprecated disabled signatures</li> <li><a href="https://github.com/angular/angular/commit/206f541d59446c088c455a56ae129f999d0b1610"><code>206f541</code></a> docs(forms): use the <code>when</code> option in disabled examples</li> <li>See full diff in <a href="https://github.com/angular/angular/commits/v22.2.3/packages/forms">compare view</a></li> </ul> </details> <br /> Updates `@angular/material` from 22.2.2 to 22.2.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/angular/components/releases">@angular/material's releases</a>.</em></p> <blockquote> <h2>22.2.3</h2> <h3>material</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/components/commit/e0c2d4df72a673d6bcab027aa4db78f2f7ec9af1"><img src="https://img.shields.io/badge/e0c2d4df7-fix-green" alt="fix - e0c2d4df7" /></a></td> <td><strong>chips:</strong> implement touch-target pattern/styles on chip component (<a href="https://redirect.github.com/angular/components/issues/33614">#33614</a>)</td> </tr> </tbody> </table> <h3>cdk</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/components/commit/a307978dc42c034ed8a13a13fce93f6884c69487"><img src="https://img.shields.io/badge/a307978dc-fix-green" alt="fix - a307978dc" /></a></td> <td><strong>a11y:</strong> treat inert elements as non-focusable (<a href="https://redirect.github.com/angular/components/issues/33846">#33846</a>)</td> </tr> </tbody> </table> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/angular/components/blob/main/CHANGELOG.md">@angular/material's changelog</a>.</em></p> <blockquote> <h1>22.2.3 "rhenium-rotor" (2026-10-14)</h1> <h3>cdk</h3> <table> <thead> <tr> <th>Commit</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/components/commit/a307978dc42c034ed8a13a13fce93f6884c69487">a307978dc</a></td> <td>fix</td> <td><strong>a11y:</strong> treat inert elements as non-focusable (<a href="https://redirect.github.com/angular/components/pull/33846">#33846</a>)</td> </tr> </tbody> </table> <h3>material</h3> <table> <thead> <tr> <th>Commit</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/components/commit/e0c2d4df72a673d6bcab027aa4db78f2f7ec9af1">e0c2d4df7</a></td> <td>fix</td> <td><strong>chips:</strong> implement touch-target pattern/styles on chip component (<a href="https://redirect.github.com/angular/components/pull/33614">#33614</a>)</td> </tr> </tbody> </table> <!-- raw HTML omitted --> <p><!-- raw HTML omitted --><!-- raw HTML omitted --></p> <h1>22.3.0-next.1 "calcium-crown" (2026-10-07)</h1> <h3>cdk</h3> <table> <thead> <tr> <th>Commit</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/components/commit/cc3829f624b523d05397cf2d66c5e3d054070d0c">cc3829f62</a></td> <td>fix</td> <td><strong>drag-drop:</strong> remove old prefixes for fullscreen elements</td> </tr> <tr> <td><a href="https://github.com/angular/components/commit/84a2366bb1b0912dcdb6f767c9507a5ee1cc916f">84a2366bb</a></td> <td>fix</td> <td><strong>drag-drop:</strong> use consistent touch coordinates for bounded dragging (<a href="https://redirect.github.com/angular/components/pull/33928">#33928</a>)</td> </tr> <tr> <td><a href="https://github.com/angular/components/commit/f6c2a193ec4ad454beeafc74469103fecfc96a12">f6c2a193e</a></td> <td>fix</td> <td><strong>overlay:</strong> remove old prefixes for fullscreen elements</td> </tr> </tbody> </table> <h3>material</h3> <table> <thead> <tr> <th>Commit</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/components/commit/cffa9cfea89ec1f1ec32295a5d1670172db4b653">cffa9cfea</a></td> <td>fix</td> <td><strong>icon:</strong> do not copy event attributes (<a href="https://redirect.github.com/angular/components/pull/33929">#33929</a>)</td> </tr> </tbody> </table> <h3>google-maps</h3> <table> <thead> <tr> <th>Commit</th> <th>Type</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/components/commit/52a1ef36c68c763656aeb070bfa9b7fa24905894">52a1ef36c</a></td> <td>fix</td> <td>use console.error instead of hard error (<a href="https://redirect.github.com/angular/components/pull/33917">#33917</a>)</td> </tr> </tbody> </table> <!-- raw HTML omitted --> <p><!-- raw HTML omitted --><!-- raw HTML omitted --></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/angular/components/commit/7c47fa5aa85eebeb10d0d28c6c60cc3bf92fd5e4"><code>7c47fa5</code></a> release: cut the v22.2.3 release</li> <li><a href="https://github.com/angular/components/commit/a307978dc42c034ed8a13a13fce93f6884c69487"><code>a307978</code></a> fix(cdk/a11y): treat inert elements as non-focusable (<a href="https://redirect.github.com/angular/components/issues/33846">#33846</a>)</li> <li><a href="https://github.com/angular/components/commit/01b48b1c9a6785ade74f1d5009afc8ef1f1829f6"><code>01b48b1</code></a> build: ban new usages of fakeAsync (<a href="https://redirect.github.com/angular/components/issues/33946">#33946</a>)</li> <li><a href="https://github.com/angular/components/commit/e0c2d4df72a673d6bcab027aa4db78f2f7ec9af1"><code>e0c2d4d</code></a> fix(material/chips): implement touch-target pattern/styles on chip component ...</li> <li>See full diff in <a href="https://github.com/angular/components/compare/v22.2.2...v22.2.3">compare view</a></li> </ul> </details> <br /> Updates `@angular/platform-browser` from 22.2.2 to 22.2.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/angular/angular/releases">@angular/platform-browser's releases</a>.</em></p> <blockquote> <h2>22.2.3</h2> <h3>common</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/fafec77b5d4e6dfc89aad72db9c132d3dfe46ba6"><img src="https://img.shields.io/badge/fafec77b5d-fix-green" alt="fix - fafec77b5d" /></a></td> <td>harden param encoding against prototype pollution</td> </tr> </tbody> </table> <h3>compiler</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/54f3de517c2e4cda264eca5f2d143a1f6967c7a9"><img src="https://img.shields.io/badge/54f3de517c-fix-green" alt="fix - 54f3de517c" /></a></td> <td>check <code>@boundary</code> blocks in the control flow content projection diagnostic</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/5e50658fd23983dd27ef89a67cea26910af6fd79"><img src="https://img.shields.io/badge/5e50658fd2-fix-green" alt="fix - 5e50658fd2" /></a></td> <td>compare the operand in ReadTemporaryExpr.isEquivalent</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/b6f9cc5d7013f8f136b38cccfe486264200f04f5"><img src="https://img.shields.io/badge/b6f9cc5d70-fix-green" alt="fix - b6f9cc5d70" /></a></td> <td>do not scope comments placed inside of a selector</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/35a02f8097724f4b6e83e1c9c008da8f1fc7f127"><img src="https://img.shields.io/badge/35a02f8097-fix-green" alt="fix - 35a02f8097" /></a></td> <td>harden JIT against prototype pollution</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/08075e8aa03800bc1b8ae793fb3d52761cdd28b6"><img src="https://img.shields.io/badge/08075e8aa0-fix-green" alt="fix - 08075e8aa0" /></a></td> <td>support dots in class binding names</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/c7a72c2bf2213d881496e70933fc61bdaaa00621"><img src="https://img.shields.io/badge/c7a72c2bf2-fix-green" alt="fix - c7a72c2bf2" /></a></td> <td>support popover property bindings</td> </tr> </tbody> </table> <h3>compiler-cli</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/fa21d083fe92e67a2a070059b850b9a32a08cef9"><img src="https://img.shields.io/badge/fa21d083fe-fix-green" alt="fix - fa21d083fe" /></a></td> <td>inline tcb when depending on local directive</td> </tr> </tbody> </table> <h3>core</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/b5208f9fc3a77a9631c2f38c30c38c777a642839"><img src="https://img.shields.io/badge/b5208f9fc3-fix-green" alt="fix - b5208f9fc3" /></a></td> <td>avoid deleting idle bucket created during another bucket's drain</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/90af679c3b585515651b138667b8eaf3df652968"><img src="https://img.shields.io/badge/90af679c3b-fix-green" alt="fix - 90af679c3b" /></a></td> <td>do not swallow compilation errors in computeStandaloneComponentScope</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/eca5fa466508ef68014cbebb0cafd63947f9eda7"><img src="https://img.shields.io/badge/eca5fa4665-fix-green" alt="fix - eca5fa4665" /></a></td> <td>don't crash initEventReplay when two apps share an APP_ID</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/e59a2303dfb4f3242552d382bbeebf6a38446856"><img src="https://img.shields.io/badge/e59a2303df-fix-green" alt="fix - e59a2303df" /></a></td> <td>error when destroying embedded view with animations</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/a23941fe7547634c9f1160541b3a2265e284f624"><img src="https://img.shields.io/badge/a23941fe75-fix-green" alt="fix - a23941fe75" /></a></td> <td>keep activeConsumer and currentInjector constant using Store helper</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/913ae7421f609c6ad375219045e9ab3f3b0eba73"><img src="https://img.shields.io/badge/913ae7421f-fix-green" alt="fix - 913ae7421f" /></a></td> <td>skip nested tick from onMicrotaskEmpty while a tick is running</td> </tr> </tbody> </table> <h3>forms</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/cc515b8b2331df643e7ff80915efc402bc97d3bb"><img src="https://img.shields.io/badge/cc515b8b23-perf-orange" alt="perf - cc515b8b23" /></a></td> <td>use addEventListener to avoid unconditional CD scheduling on blur</td> </tr> </tbody> </table> <h3>migrations</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/d04f214d04678f0dbb0b769a53d1f15ece09c4a2"><img src="https://img.shields.io/badge/d04f214d04-fix-green" alt="fix - d04f214d04" /></a></td> <td>normalize .d.ts paths in output migration field IDs</td> </tr> </tbody> </table> <h3>router</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/f9a4f751f0ad0f3f22d49430475d6d57fa29fd3f"><img src="https://img.shields.io/badge/f9a4f751f0-fix-green" alt="fix - f9a4f751f0" /></a></td> <td>check abort signal state on subscribe</td> </tr> </tbody> </table> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/angular/angular/commits/v22.2.3/packages/platform-browser">compare view</a></li> </ul> </details> <br /> Updates `@angular/platform-browser-dynamic` from 22.2.2 to 22.2.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/angular/angular/releases">@angular/platform-browser-dynamic's releases</a>.</em></p> <blockquote> <h2>22.2.3</h2> <h3>common</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/fafec77b5d4e6dfc89aad72db9c132d3dfe46ba6"><img src="https://img.shields.io/badge/fafec77b5d-fix-green" alt="fix - fafec77b5d" /></a></td> <td>harden param encoding against prototype pollution</td> </tr> </tbody> </table> <h3>compiler</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/54f3de517c2e4cda264eca5f2d143a1f6967c7a9"><img src="https://img.shields.io/badge/54f3de517c-fix-green" alt="fix - 54f3de517c" /></a></td> <td>check <code>@boundary</code> blocks in the control flow content projection diagnostic</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/5e50658fd23983dd27ef89a67cea26910af6fd79"><img src="https://img.shields.io/badge/5e50658fd2-fix-green" alt="fix - 5e50658fd2" /></a></td> <td>compare the operand in ReadTemporaryExpr.isEquivalent</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/b6f9cc5d7013f8f136b38cccfe486264200f04f5"><img src="https://img.shields.io/badge/b6f9cc5d70-fix-green" alt="fix - b6f9cc5d70" /></a></td> <td>do not scope comments placed inside of a selector</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/35a02f8097724f4b6e83e1c9c008da8f1fc7f127"><img src="https://img.shields.io/badge/35a02f8097-fix-green" alt="fix - 35a02f8097" /></a></td> <td>harden JIT against prototype pollution</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/08075e8aa03800bc1b8ae793fb3d52761cdd28b6"><img src="https://img.shields.io/badge/08075e8aa0-fix-green" alt="fix - 08075e8aa0" /></a></td> <td>support dots in class binding names</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/c7a72c2bf2213d881496e70933fc61bdaaa00621"><img src="https://img.shields.io/badge/c7a72c2bf2-fix-green" alt="fix - c7a72c2bf2" /></a></td> <td>support popover property bindings</td> </tr> </tbody> </table> <h3>compiler-cli</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/fa21d083fe92e67a2a070059b850b9a32a08cef9"><img src="https://img.shields.io/badge/fa21d083fe-fix-green" alt="fix - fa21d083fe" /></a></td> <td>inline tcb when depending on local directive</td> </tr> </tbody> </table> <h3>core</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/b5208f9fc3a77a9631c2f38c30c38c777a642839"><img src="https://img.shields.io/badge/b5208f9fc3-fix-green" alt="fix - b5208f9fc3" /></a></td> <td>avoid deleting idle bucket created during another bucket's drain</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/90af679c3b585515651b138667b8eaf3df652968"><img src="https://img.shields.io/badge/90af679c3b-fix-green" alt="fix - 90af679c3b" /></a></td> <td>do not swallow compilation errors in computeStandaloneComponentScope</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/eca5fa466508ef68014cbebb0cafd63947f9eda7"><img src="https://img.shields.io/badge/eca5fa4665-fix-green" alt="fix - eca5fa4665" /></a></td> <td>don't crash initEventReplay when two apps share an APP_ID</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/e59a2303dfb4f3242552d382bbeebf6a38446856"><img src="https://img.shields.io/badge/e59a2303df-fix-green" alt="fix - e59a2303df" /></a></td> <td>error when destroying embedded view with animations</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/a23941fe7547634c9f1160541b3a2265e284f624"><img src="https://img.shields.io/badge/a23941fe75-fix-green" alt="fix - a23941fe75" /></a></td> <td>keep activeConsumer and currentInjector constant using Store helper</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/913ae7421f609c6ad375219045e9ab3f3b0eba73"><img src="https://img.shields.io/badge/913ae7421f-fix-green" alt="fix - 913ae7421f" /></a></td> <td>skip nested tick from onMicrotaskEmpty while a tick is running</td> </tr> </tbody> </table> <h3>forms</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/cc515b8b2331df643e7ff80915efc402bc97d3bb"><img src="https://img.shields.io/badge/cc515b8b23-perf-orange" alt="perf - cc515b8b23" /></a></td> <td>use addEventListener to avoid unconditional CD scheduling on blur</td> </tr> </tbody> </table> <h3>migrations</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/d04f214d04678f0dbb0b769a53d1f15ece09c4a2"><img src="https://img.shields.io/badge/d04f214d04-fix-green" alt="fix - d04f214d04" /></a></td> <td>normalize .d.ts paths in output migration field IDs</td> </tr> </tbody> </table> <h3>router</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/f9a4f751f0ad0f3f22d49430475d6d57fa29fd3f"><img src="https://img.shields.io/badge/f9a4f751f0-fix-green" alt="fix - f9a4f751f0" /></a></td> <td>check abort signal state on subscribe</td> </tr> </tbody> </table> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/angular/angular/commits/v22.2.3/packages/platform-browser-dynamic">compare view</a></li> </ul> </details> <br /> Updates `@angular/router` from 22.2.2 to 22.2.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/angular/angular/releases">@angular/router's releases</a>.</em></p> <blockquote> <h2>22.2.3</h2> <h3>common</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/fafec77b5d4e6dfc89aad72db9c132d3dfe46ba6"><img src="https://img.shields.io/badge/fafec77b5d-fix-green" alt="fix - fafec77b5d" /></a></td> <td>harden param encoding against prototype pollution</td> </tr> </tbody> </table> <h3>compiler</h3> <table> <thead> <tr> <th>Commit</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/angular/angular/commit/54f3de517c2e4cda264eca5f2d143a1f6967c7a9"><img src="https://img.shields.io/badge/54f3de517c-fix-green" alt="fix - 54f3de517c" /></a></td> <td>check <code>@boundary</code> blocks in the control flow content projection diagnostic</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/5e50658fd23983dd27ef89a67cea26910af6fd79"><img src="https://img.shields.io/badge/5e50658fd2-fix-green" alt="fix - 5e50658fd2" /></a></td> <td>compare the operand in ReadTemporaryExpr.isEquivalent</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/b6f9cc5d7013f8f136b38cccfe486264200f04f5"><img src="https://img.shields.io/badge/b6f9cc5d70-fix-green" alt="fix - b6f9cc5d70" /></a></td> <td>do not scope comments placed inside of a selector</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/35a02f8097724f4b6e83e1c9c008da8f1fc7f127"><img src="https://img.shields.io/badge/35a02f8097-fix-green" alt="fix - 35a02f8097" /></a></td> <td>harden JIT against prototype pollution</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/08075e8aa03800bc1b8ae793fb3d52761cdd28b6"><img src="https://img.shields.io/badge/08075e8aa0-fix-green" alt="fix - 08075e8aa0" /></a></td> <td>support dots in class binding names</td> </tr> <tr> <td><a href="https://github.com/angular/angular/commit/c7a72c2bf2213d881496e70933fc61bdaaa00621"><img src="https://img.shields.io/badge/c7a72c2bf2-fix-green" alt="fix - c7a72c2bf2" /></a></td> <td>support popover property bindings</td> </tr> </tbody> </table> <h3>compiler-cli</h3> <table> <thead> <tr> <th>Commit</th> …
…1029) ## Summary With `COLLECTOR_CRON_SCHEDULE` configured, the dashboard's Run collectors action launches the SMART collector as a scheduler and kills it after five minutes. Manual and managed SMART invocations now pass `--cron-schedule=` so they collect once and exit, even when YAML contains a schedule. ## Type of Change - [x] Bug fix (non-breaking change that fixes an issue) - [ ] New feature (non-breaking change that adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [x] Documentation update - [ ] Refactoring (no functional changes) - [ ] CI/CD or infrastructure change ## Related Issues / Linked Issues Closes #1014 ## Changes Made - Share one-shot arguments between the backend manual trigger and the standalone omnibus runner. Only SMART receives the schedule flag; other collectors retain their existing arguments. - Apply the explicit override to Docker SMART cron and startup invocations, including the collector-omnibus startup helper. - Document manual execution and correct CLI help. Preserve normal standalone scheduling, API settings, and the backend timeout. - Repair the dependency audit exposed by this PR: update active Undici copies to 6.29.1/7.30.1, npm to 11.21.1, and frontend body-parser/fast-uri patches. The branch includes current develop, whose Angular CLI 22.2.3 update supplies patched Zod. Replace obsolete bundled-npm advisory exceptions with the three remaining IDs, retaining the existing November 1 expiry and bundle-only path restrictions. Add six policy regression tests to CI. ## Testing / Test plan - [x] I have tested this locally - [x] I have added/updated tests that prove my fix/feature works - [x] All existing tests pass Passed: - `go test -race ./collector/cmd/collector-metrics ./collector/pkg/omnibus ./webapp/backend/pkg/web/handler` - `TMPDIR=/private/tmp go test ./collector/...` - `go vet ./collector/cmd/collector-metrics ./collector/pkg/omnibus ./webapp/backend/pkg/web/handler` - `bash docker/tests/collector-startup-gate_test.sh` and `bash docker/tests/entrypoint-startup-log_test.sh` using Bash 5 locally - `go mod vendor`, followed by golangci-lint v2.14.0 with `--timeout=5m --new-from-rev=origin/develop`: 0 issues - `git diff --cached --check` Regression tests exercise the actual CLI with environment/YAML schedules and startup delays, and verify child arguments and retained API settings through executable fixtures. The full collector suite initially encountered two unchanged macOS `/var` versus `/private/var` path assertions; it passed with canonical `TMPDIR=/private/tmp`. The original collector head passed repository CI apart from the dependency audit. All 29 GitHub checks passed on previous head `02afd6865b3d3fa9e0f4a459e8dcf816147529ac`, including both npm audit stages, frontend/backend tests, lint, builds, and security scans. Dependency repair validation on Node 24.15.0: clean root/frontend installs, both audit gates, six audit-policy tests, imports of every configured release plugin, frontend production build, and frontend lint pass. Frontend audit reports zero vulnerabilities. Root audit retains two vulnerable packages only inside the unused bundled npm; the gate permits their three documented advisories until the unchanged November 1 expiry. Build output retains existing template, stylesheet-budget, CommonJS, and browser-support warnings. The follow-up at `e7b5234bde80936284c5be07fff188ba86e76885` rejects empty audit paths for bundled advisory exceptions. Empty-path cases failed for all three advisory IDs before the fix; all six policy tests and the live root audit gate pass after the fix. All 29 GitHub checks passed for this head. ## Checklist - [x] My code follows the project's code style - [x] I have performed a self-review of my code - [x] I have commented my code where necessary (particularly complex areas) - [x] I have updated the documentation if needed - [x] My changes generate no new warnings - [x] No console.log, debug statements, or commented-out code ## Screenshots (if applicable) Not applicable. No visual changes. ## Additional Notes Review: required (user-requested independent review and dependency-audit policy change). The review at 02afd68 returned FIX_FIRST for empty audit paths satisfying the bundled-path check. Independent read-only follow-up review of e7b5234 returned SHIP: the finding is fixed and no new findings were identified. All 29 checks passed. Merge remains pending operator authorization. Target: `develop`. No cross-repository dependency. Updated binaries and images require deployment before this changes running instances. No deployment or real-disk acceptance test has been performed. This change does not import the beta branch's separate collector concurrency changes.
…nd (#1002) Bumps [ng-apexcharts](https://github.com/apexcharts/ng-apexcharts) from 3.1.0 to 3.2.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/apexcharts/ng-apexcharts/releases">ng-apexcharts's releases</a>.</em></p> <blockquote> <h2>v3.2.0</h2> <h3>Features</h3> <ul> <li>the <code>apexcharts</code> peer dependency is now <code>^6.0.0 || ^7.0.0 || ^8.0.0</code>, so installing ApexCharts 8 next to this package does not produce a peer conflict once 8 is released</li> <li><code>ng add ng-apexcharts</code> installs <code>^6.7.0 || ^7.0.0 || ^8.0.0</code>. npm resolves it to the newest published version that satisfies, so a fresh project lands on 7.x today and on 8.x once ApexCharts 8 is released, with no further ng-apexcharts release needed</li> </ul> <h3>Bug Fixes</h3> <ul> <li>the published package declares its licence. Its <code>package.json</code> had no <code>license</code> field, so npm and licence scanners showed this commercial package as unlicensed. It now reads <code>SEE LICENSE IN LICENSE.md</code>, and the package ships that file</li> <li>the licence text is corrected: the Community threshold counts revenue, budget, funding or equivalent resources, whichever is highest, and the file is renamed <code>LICENSE.md</code> so GitHub renders it</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/apexcharts/ng-apexcharts/blob/master/CHANGELOG.md">ng-apexcharts's changelog</a>.</em></p> <blockquote> <h1><a href="https://github.com/apexcharts/ng-apexcharts/compare/v3.1.0...v3.2.0">3.2.0</a> (2026-10-09)</h1> <h3>Features</h3> <ul> <li>the <code>apexcharts</code> peer dependency is now <code>^6.0.0 || ^7.0.0 || ^8.0.0</code>, so installing ApexCharts 8 next to this package does not produce a peer conflict once 8 is released</li> <li><code>ng add ng-apexcharts</code> installs <code>^6.7.0 || ^7.0.0 || ^8.0.0</code>. npm resolves it to the newest published version that satisfies, so a fresh project lands on 7.x today and on 8.x once ApexCharts 8 is released, with no further ng-apexcharts release needed</li> </ul> <h3>Bug Fixes</h3> <ul> <li>the published package declares its licence. Its <code>package.json</code> had no <code>license</code> field, so npm and licence scanners showed this commercial package as unlicensed. It now reads <code>SEE LICENSE IN LICENSE.md</code>, and the package ships that file</li> <li>the licence text is corrected: the Community threshold counts revenue, budget, funding or equivalent resources, whichever is highest, and the file is renamed <code>LICENSE.md</code> so GitHub renders it</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/apexcharts/ng-apexcharts/commit/97d2b588b3694fc2f644adc088a36370493963f7"><code>97d2b58</code></a> release: 3.2.0</li> <li><a href="https://github.com/apexcharts/ng-apexcharts/commit/c36ef1f4965853891078bae80ec29aaffc05bcbb"><code>c36ef1f</code></a> feat: admit apexcharts 8 in the peer range</li> <li><a href="https://github.com/apexcharts/ng-apexcharts/commit/f8034a047ed011be1a7525b1a41c2376a1505135"><code>f8034a0</code></a> fix(npm): ship LICENSE.md, the file the manifest points at</li> <li><a href="https://github.com/apexcharts/ng-apexcharts/commit/b1a0fe8b11798d58c41d3f0ee9012f0ced08d16b"><code>b1a0fe8</code></a> fix(licence): thank Community users without calling the product free and open</li> <li><a href="https://github.com/apexcharts/ng-apexcharts/commit/b1cbb4c3ba7af0c4f347b2a3eaee0760aa18b4f4"><code>b1cbb4c</code></a> build(deps): bump Angular to 22.2.1 and patch vulnerable transitive deps (<a href="https://redirect.github.com/apexcharts/ng-apexcharts/issues/529">#529</a>)</li> <li><a href="https://github.com/apexcharts/ng-apexcharts/commit/d60f9a06530836c44b2067d4d891bc8adb686a37"><code>d60f9a0</code></a> fix(licence): rename LICENSE to LICENSE.md so GitHub renders it</li> <li><a href="https://github.com/apexcharts/ng-apexcharts/commit/e723c51df66bb97d161d8c36845ead66ede812f6"><code>e723c51</code></a> fix(npm): the published package declared no licence at all</li> <li><a href="https://github.com/apexcharts/ng-apexcharts/commit/e43636df123005e026f40cf758c920e9f922f914"><code>e43636d</code></a> fix(licence): the $2M threshold is not a revenue test</li> <li><a href="https://github.com/apexcharts/ng-apexcharts/commit/99105aa7260c44ec84ab6fc195042b8ed4de5d83"><code>99105aa</code></a> fix(licence): branch the licence on which plan the product needs</li> <li><a href="https://github.com/apexcharts/ng-apexcharts/commit/84e92be622e9848ffce2c0e322ccec2422f9b261"><code>84e92be</code></a> fix(licence): drop the backslash escapes before the dollar amounts</li> <li>Additional commits viewable in <a href="https://github.com/apexcharts/ng-apexcharts/compare/v3.1.0...v3.2.0">compare view</a></li> </ul> </details> <br /> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Starosdev <eder@staros.dev>
…1001) Bumps [apexcharts](https://github.com/apexcharts/apexcharts.js) from 7.6.0 to 8.4.1. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/apexcharts/apexcharts.js/releases">apexcharts's releases</a>.</em></p> <blockquote> <h2>💎 Version 8.4.1</h2> <p>Charts now work inside a shadow root: menus, undo, ink and storyboard keep working, CSS variable colours set on the host resolve against the chart, and exports bake them in. Every chart's styles are injected into its own root and removed when the last chart there is destroyed.</p> <h2>🐛 Fixes</h2> <ul> <li>Bind the hold-to-measure key after the first render.</li> <li>Keep menus, undo, ink and storyboard working inside a shadow root.</li> <li>Resolve CSS variable colours against the chart, and bake them into exports.</li> <li>Close the export menu on outside presses, resolve treemap scale vars.</li> </ul> <p>Upgrading is <code>npm install apexcharts@8.4.1</code>.</p> <p>Full changelog, with the detail behind each change: <a href="https://github.com/apexcharts/apexcharts.js/compare/v8.4.0...v8.4.1">https://github.com/apexcharts/apexcharts.js/compare/v8.4.0...v8.4.1</a></p> <h2>💎 Version 8.4.0</h2> <p>A security fix: a series name, category or goal name containing HTML could run script in the legend or tooltip, also in server-rendered HTML. Data you pass in now shows as text there; HTML a formatter returns still renders. Upgrade if those labels come from user data.</p> <p>Also less work per render for bars, timelines and treemaps, tooltip.custom on sunburst, icicle and treemap branches, and these changes you may notice:</p> <table> <thead> <tr> <th>Change</th> <th>What to check</th> </tr> </thead> <tbody> <tr> <td>Names and labels show HTML as text</td> <td>markup in names</td> </tr> <tr> <td>tooltip.custom runs on treemap branches</td> <td>custom reading points</td> </tr> <tr> <td>Trellis honours chart.zoom.enabled false</td> <td>grids that set it</td> </tr> <tr> <td>Sunburst, icicle honour dataLabels.enabled</td> <td>dataLabels.enabled</td> </tr> <tr> <td>Sunburst crumb uses drilldown.breadcrumb</td> <td>breadcrumb options</td> </tr> </tbody> </table> <h2>🐛 Fixes</h2> <ul> <li>Project stream-scroll pathFrom from the joined path (<a href="https://redirect.github.com/apexcharts/apexcharts.js/issues/5316">#5316</a>). Thanks <a href="https://github.com/SahinurDEV"><code>@SahinurDEV</code></a>.</li> <li>Do not expand zero stacked columns by series stroke width (<a href="https://redirect.github.com/apexcharts/apexcharts.js/issues/5046">#5046</a>). Thanks <a href="https://github.com/SahinurDEV"><code>@SahinurDEV</code></a>.</li> <li>Draw series added to a shared logarithmic axis. Thanks <a href="https://github.com/Arthur031221"><code>@Arthur031221</code></a>.</li> <li>Read dates past year 9999 as utc, not local time.</li> <li>Fire legendHover once per item, not on every mouse move.</li> <li>Keep reordered series on a shared logarithmic axis (<a href="https://redirect.github.com/apexcharts/apexcharts.js/issues/5353">#5353</a>).</li> <li>Ease an axis border from its own extent.</li> <li>Draw server renders the way the browser draws them.</li> <li>Return to a level as it is now, its overrides undone.</li> <li>Honour enabled toggles and settle async levels safely.</li> <li>Hand back the raw series when an alias type is switched off.</li> <li>Grid tooltip reads numeric x and horizontal bars right.</li> <li>Push one panel data patch from render and updateSeries.</li> <li>Keep legend, zoom and tool state in step across rebuilds.</li> <li>Respect zoom.enabled false; edge labels read effective y.</li> <li>Sort dates, leave combo series alone.</li> <li>Restored zoom focus keeps its ancestors.</li> <li>Gradient legend spans explicit colour stops.</li> <li>Keep line forecasts and gradient area strokes on SVG.</li> <li>Paint primitive styling and custom series identity.</li> <li>Divide 100% stacked parts by their own stack's total.</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/apexcharts/apexcharts.js/commit/0cda9fbcda66de67a584d06324b66ef5ae7469aa"><code>0cda9fb</code></a> release: 8.4.1</li> <li><a href="https://github.com/apexcharts/apexcharts.js/commit/ecbbfb2ec5cb943704f90874f48ba397ca864e01"><code>ecbbfb2</code></a> chore: bump version to 8.4.1</li> <li><a href="https://github.com/apexcharts/apexcharts.js/commit/3753022c39c4ea9ff363bed3328458ce1c77f93d"><code>3753022</code></a> chore(build): raise the default budget for the export menu and treemap fixes</li> <li><a href="https://github.com/apexcharts/apexcharts.js/commit/9a2f64273973531dea3f20a0d7bae24b8fe062a8"><code>9a2f642</code></a> fix: close the export menu on outside presses, resolve treemap scale vars</li> <li><a href="https://github.com/apexcharts/apexcharts.js/commit/e650bc10c2b18f7c49b30e642f32bd610aee5763"><code>e650bc1</code></a> chore(build): raise the default and full budgets for the shadow DOM fixes</li> <li><a href="https://github.com/apexcharts/apexcharts.js/commit/c8860a0b1348ad235ec4cb61bba8242f642efb23"><code>c8860a0</code></a> fix: resolve CSS variable colours against the chart, and bake them into exports</li> <li><a href="https://github.com/apexcharts/apexcharts.js/commit/d2f99dec9907d8c42c8933dba63280846660c607"><code>d2f99de</code></a> fix: keep menus, undo, ink and storyboard working inside a shadow root</li> <li><a href="https://github.com/apexcharts/apexcharts.js/commit/0520bddcde160def5bed36d4a065b6371a9deabe"><code>0520bdd</code></a> fix(measure): bind the hold-to-measure key after the first render</li> <li><a href="https://github.com/apexcharts/apexcharts.js/commit/a52936ef27dfa041af222a8f6533dd17c7623e11"><code>a52936e</code></a> build(deps): bump apex-commons to 0.8.3 for the shadow DOM helpers</li> <li><a href="https://github.com/apexcharts/apexcharts.js/commit/3017de3d0e1695045ea672e4c4eb3ef86055f2fd"><code>3017de3</code></a> release: 8.4.0</li> <li>Additional commits viewable in <a href="https://github.com/apexcharts/apexcharts.js/compare/v7.6.0...v8.4.1">compare view</a></li> </ul> </details> <br /> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Starosdev <eder@staros.dev>
…8 updates (#1030) Bumps the dev-dependencies group with 8 updates in the /webapp/frontend directory: | Package | From | To | | --- | --- | --- | | [@types/lodash](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash) | `4.17.26` | `4.17.27` | | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `8.71.1` | `8.72.0` | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `8.71.1` | `8.72.0` | | [angular-eslint](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/angular-eslint) | `22.5.0` | `22.6.0` | | [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) | `5.5.6` | `5.5.7` | | [ngx-markdown](https://github.com/jfcere/ngx-markdown) | `22.1.0` | `22.1.1` | | [prettier](https://github.com/prettier/prettier) | `3.9.9` | `3.9.10` | | [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.71.1` | `8.72.0` | Updates `@types/lodash` from 4.17.26 to 4.17.27 <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lodash">compare view</a></li> </ul> </details> <br /> Updates `@typescript-eslint/eslint-plugin` from 8.71.1 to 8.72.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">@typescript-eslint/eslint-plugin's releases</a>.</em></p> <blockquote> <h2>v8.72.0</h2> <h2>8.72.0 (2026-10-19)</h2> <h3>🚀 Features</h3> <ul> <li><strong>eslint-plugin:</strong> lazy load rules (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13010">#13010</a>)</li> <li><strong>eslint-plugin:</strong> [await-thenable] add <code>allowMixedPromiseArrays</code> option (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12992">#12992</a>)</li> <li><strong>typescript-estree:</strong> error on abstract keyword that precedes export (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13019">#13019</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li><strong>ast-spec:</strong> add <code>JSXFragment</code> to <code>JSXAttribute['value']</code> (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13051">#13051</a>)</li> <li><strong>eslint-plugin:</strong> [prefer-readonly-parameter-types] check where allowed type aliases are declared (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13016">#13016</a>)</li> <li><strong>eslint-plugin:</strong> [no-deprecated] report deprecated properties in object literals (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12704">#12704</a>)</li> <li><strong>eslint-plugin:</strong> use isTypeLiteralType instead of type.isLiteral() to include bigint literals on TS < 5.0 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13053">#13053</a>)</li> <li><strong>eslint-plugin:</strong> [require-array-sort-compare] check tuples (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13058">#13058</a>)</li> <li><strong>eslint-plugin:</strong> [require-array-sort-compare] ignore extra this type argument on TS < 5.1 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13055">#13055</a>)</li> <li><strong>type-utils:</strong> discriminateAnyType crashes when calling getAwaitedType on awaited type in TS < 5.0 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13054">#13054</a>)</li> <li><strong>typescript-estree:</strong> include leading and trailing comments & whitespace in Program range (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12991">#12991</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Evyatar Daud <a href="https://github.com/StyleShit"><code>@StyleShit</code></a></li> <li>Junichiro Kasuya <a href="https://github.com/jksy"><code>@jksy</code></a></li> <li>Mitch Fultz <a href="https://github.com/fitchmultz"><code>@fitchmultz</code></a></li> <li>Shaan GS <a href="https://github.com/ShaanGS"><code>@ShaanGS</code></a></li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.72.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> <h2>v8.71.2</h2> <h2>8.71.2 (2026-10-12)</h2> <h3>🩹 Fixes</h3> <ul> <li><strong>eslint-plugin:</strong> [no-unused-vars] avoid false-positives when not using our parser (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12989">#12989</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-type-parameters] count instantiated mapped type templates (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12974">#12974</a>)</li> <li><strong>eslint-plugin:</strong> [no-unused-vars] ignore type-only refs for after-used (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12977">#12977</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-type-parameters] parenthesize constraint in optional tuple elements (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12995">#12995</a>)</li> <li><strong>eslint-plugin:</strong> [prefer-optional-chain] safe fix when the chain ends with a strict null comparison (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12805">#12805</a>)</li> <li><strong>type-utils:</strong> match linked packages and packages with missing version in <code>TypeOrValueSpecifier</code> (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12948">#12948</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Abraham Guo</li> <li>Brad Zacher <a href="https://github.com/bradzacher"><code>@bradzacher</code></a></li> <li>Evyatar Daud <a href="https://github.com/StyleShit"><code>@StyleShit</code></a></li> <li>Josh Goldberg</li> <li>Vinccool96</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md">@typescript-eslint/eslint-plugin's changelog</a>.</em></p> <blockquote> <h2>8.72.0 (2026-10-19)</h2> <h3>🚀 Features</h3> <ul> <li><strong>eslint-plugin:</strong> [await-thenable] add <code>allowMixedPromiseArrays</code> option (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12992">#12992</a>)</li> <li><strong>eslint-plugin:</strong> lazy load rules (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13010">#13010</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li><strong>type-utils:</strong> discriminateAnyType crashes when calling getAwaitedType on awaited type in TS < 5.0 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13054">#13054</a>)</li> <li><strong>eslint-plugin:</strong> [require-array-sort-compare] ignore extra this type argument on TS < 5.1 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13055">#13055</a>)</li> <li><strong>eslint-plugin:</strong> [require-array-sort-compare] check tuples (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13058">#13058</a>)</li> <li><strong>eslint-plugin:</strong> use isTypeLiteralType instead of type.isLiteral() to include bigint literals on TS < 5.0 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13053">#13053</a>)</li> <li><strong>eslint-plugin:</strong> [no-deprecated] report deprecated properties in object literals (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12704">#12704</a>)</li> <li><strong>eslint-plugin:</strong> [prefer-readonly-parameter-types] check where allowed type aliases are declared (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13016">#13016</a>)</li> <li><strong>typescript-estree:</strong> include leading and trailing comments & whitespace in Program range (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12991">#12991</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Evyatar Daud <a href="https://github.com/StyleShit"><code>@StyleShit</code></a></li> <li>Junichiro Kasuya <a href="https://github.com/jksy"><code>@jksy</code></a></li> <li>Mitch Fultz <a href="https://github.com/fitchmultz"><code>@fitchmultz</code></a></li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.72.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> <h2>8.71.2 (2026-10-12)</h2> <h3>🩹 Fixes</h3> <ul> <li><strong>eslint-plugin:</strong> [prefer-optional-chain] safe fix when the chain ends with a strict null comparison (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12805">#12805</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-type-parameters] parenthesize constraint in optional tuple elements (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12995">#12995</a>)</li> <li><strong>eslint-plugin:</strong> [no-unused-vars] ignore type-only refs for after-used (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12977">#12977</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-type-parameters] count instantiated mapped type templates (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12974">#12974</a>)</li> <li><strong>eslint-plugin:</strong> [no-unused-vars] avoid false-positives when not using our parser (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12989">#12989</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Abraham Guo</li> <li>Brad Zacher <a href="https://github.com/bradzacher"><code>@bradzacher</code></a></li> <li>Josh Goldberg</li> <li>Vinccool96</li> <li>Younsang Na <a href="https://github.com/nayounsang"><code>@nayounsang</code></a></li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.71.2">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/a4c2603d3e4fd43b33bc25b82457716e9f7cef71"><code>a4c2603</code></a> chore(release): publish 8.72.0</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/c6eb98c17cbeee540d3c48d1406098430b2f0660"><code>c6eb98c</code></a> feat(eslint-plugin): [await-thenable] add <code>allowMixedPromiseArrays</code> option (#...</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/b382b74579e5514c247ed54d0dfc428f3a173f3a"><code>b382b74</code></a> fix(type-utils): discriminateAnyType crashes when calling getAwaitedType on a...</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/79edd896790b031457fc0ca6f81c732b29921c9d"><code>79edd89</code></a> fix(eslint-plugin): [require-array-sort-compare] ignore extra this type argum...</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/e7d57dd6ea0945ae71ba9f68d04270caecda1735"><code>e7d57dd</code></a> fix(eslint-plugin): [require-array-sort-compare] check tuples (<a href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin/issues/13058">#13058</a>)</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/2d107aef73ec9a36a6b4da501ab3fb97dca1d4c0"><code>2d107ae</code></a> fix(eslint-plugin): use isTypeLiteralType instead of type.isLiteral() to incl...</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/e4695b39dbf2427afe14531095c6221c340ee3f1"><code>e4695b3</code></a> feat(eslint-plugin): lazy load rules (<a href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin/issues/13010">#13010</a>)</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/a1a912bffce02a96f8661806d92202f867f9c6ce"><code>a1a912b</code></a> fix(eslint-plugin): [no-deprecated] report deprecated properties in object li...</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/1edc975742ca23390a4daf3a1d0193feafe92818"><code>1edc975</code></a> fix(eslint-plugin): [prefer-readonly-parameter-types] check where allowed typ...</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/61cb7009708e90add897ca53c58666a19e615606"><code>61cb700</code></a> chore: fix all <code>eslint-plugin-internal/no-multiple-lines-of-errors</code> (<a href="https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin/issues/12893">#12893</a>)</li> <li>Additional commits viewable in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.72.0/packages/eslint-plugin">compare view</a></li> </ul> </details> <br /> Updates `@typescript-eslint/parser` from 8.71.1 to 8.72.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">@typescript-eslint/parser's releases</a>.</em></p> <blockquote> <h2>v8.72.0</h2> <h2>8.72.0 (2026-10-19)</h2> <h3>🚀 Features</h3> <ul> <li><strong>eslint-plugin:</strong> lazy load rules (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13010">#13010</a>)</li> <li><strong>eslint-plugin:</strong> [await-thenable] add <code>allowMixedPromiseArrays</code> option (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12992">#12992</a>)</li> <li><strong>typescript-estree:</strong> error on abstract keyword that precedes export (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13019">#13019</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li><strong>ast-spec:</strong> add <code>JSXFragment</code> to <code>JSXAttribute['value']</code> (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13051">#13051</a>)</li> <li><strong>eslint-plugin:</strong> [prefer-readonly-parameter-types] check where allowed type aliases are declared (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13016">#13016</a>)</li> <li><strong>eslint-plugin:</strong> [no-deprecated] report deprecated properties in object literals (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12704">#12704</a>)</li> <li><strong>eslint-plugin:</strong> use isTypeLiteralType instead of type.isLiteral() to include bigint literals on TS < 5.0 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13053">#13053</a>)</li> <li><strong>eslint-plugin:</strong> [require-array-sort-compare] check tuples (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13058">#13058</a>)</li> <li><strong>eslint-plugin:</strong> [require-array-sort-compare] ignore extra this type argument on TS < 5.1 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13055">#13055</a>)</li> <li><strong>type-utils:</strong> discriminateAnyType crashes when calling getAwaitedType on awaited type in TS < 5.0 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13054">#13054</a>)</li> <li><strong>typescript-estree:</strong> include leading and trailing comments & whitespace in Program range (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12991">#12991</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Evyatar Daud <a href="https://github.com/StyleShit"><code>@StyleShit</code></a></li> <li>Junichiro Kasuya <a href="https://github.com/jksy"><code>@jksy</code></a></li> <li>Mitch Fultz <a href="https://github.com/fitchmultz"><code>@fitchmultz</code></a></li> <li>Shaan GS <a href="https://github.com/ShaanGS"><code>@ShaanGS</code></a></li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.72.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> <h2>v8.71.2</h2> <h2>8.71.2 (2026-10-12)</h2> <h3>🩹 Fixes</h3> <ul> <li><strong>eslint-plugin:</strong> [no-unused-vars] avoid false-positives when not using our parser (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12989">#12989</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-type-parameters] count instantiated mapped type templates (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12974">#12974</a>)</li> <li><strong>eslint-plugin:</strong> [no-unused-vars] ignore type-only refs for after-used (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12977">#12977</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-type-parameters] parenthesize constraint in optional tuple elements (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12995">#12995</a>)</li> <li><strong>eslint-plugin:</strong> [prefer-optional-chain] safe fix when the chain ends with a strict null comparison (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12805">#12805</a>)</li> <li><strong>type-utils:</strong> match linked packages and packages with missing version in <code>TypeOrValueSpecifier</code> (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12948">#12948</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Abraham Guo</li> <li>Brad Zacher <a href="https://github.com/bradzacher"><code>@bradzacher</code></a></li> <li>Evyatar Daud <a href="https://github.com/StyleShit"><code>@StyleShit</code></a></li> <li>Josh Goldberg</li> <li>Vinccool96</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md">@typescript-eslint/parser's changelog</a>.</em></p> <blockquote> <h2>8.72.0 (2026-10-19)</h2> <p>This was a version bump only for parser to align it with other projects, there were no code changes.</p> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.72.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> <h2>8.71.2 (2026-10-12)</h2> <p>This was a version bump only for parser to align it with other projects, there were no code changes.</p> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.71.2">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/a4c2603d3e4fd43b33bc25b82457716e9f7cef71"><code>a4c2603</code></a> chore(release): publish 8.72.0</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/7488d681f6e0e96c2aaa1eee9c3d1b9b1ef077cb"><code>7488d68</code></a> chore(release): publish 8.71.2</li> <li>See full diff in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.72.0/packages/parser">compare view</a></li> </ul> </details> <br /> Updates `angular-eslint` from 22.5.0 to 22.6.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/angular-eslint/angular-eslint/releases">angular-eslint's releases</a>.</em></p> <blockquote> <h2>v22.6.0</h2> <h2>22.6.0 (2026-10-11)</h2> <h3>🚀 Features</h3> <ul> <li><strong>eslint-plugin:</strong> [prefer-standalone] add allowExplicitStandalone option (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3237">#3237</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li>update dependency <code>@angular/compiler</code> to v22.1.5 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3205">#3205</a>)</li> <li>update dependency <code>@angular/compiler</code> to v22.1.6 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3217">#3217</a>)</li> <li>update dependency eslint to v10.10.0 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3209">#3209</a>)</li> <li>update typescript-eslint packages to v8.70.0 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3212">#3212</a>)</li> <li>update dependency <code>@angular/compiler</code> to v22.1.7 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3230">#3230</a>)</li> <li>update dependency eslint to v10.11.0 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3233">#3233</a>)</li> <li>update typescript-eslint packages to v8.70.1 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3244">#3244</a>)</li> <li>update dependency <code>@angular/compiler</code> to v22.2.0 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3247">#3247</a>)</li> <li>update typescript-eslint packages to v8.71.0 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3258">#3258</a>)</li> <li>update dependency <code>@angular/compiler</code> to v22.2.1 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3264">#3264</a>)</li> <li>update dependency eslint to v10.12.0 (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3274">#3274</a>)</li> <li><strong>eslint-plugin:</strong> [reactive-context-must-read-signal] ignore inherited primitive names (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3201">#3201</a>)</li> <li><strong>eslint-plugin:</strong> ensure <code>prefix</code> rule option schema is fully typed (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3246">#3246</a>)</li> <li><strong>eslint-plugin:</strong> [prefer-signal-model] rewrite the emit calls of the removed output (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3200">#3200</a>)</li> <li><strong>eslint-plugin-template:</strong> [conditional-complexity] check control flow (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3260">#3260</a>)</li> <li><strong>template-parser:</strong> traverse <a href="https://github.com/defer"><code>@defer</code></a> hydrate triggers (<a href="https://redirect.github.com/angular-eslint/angular-eslint/pull/3231">#3231</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Andrew Kazakov <a href="https://github.com/andreww2012"><code>@andreww2012</code></a></li> <li>Daniel Pinto <a href="https://github.com/Cayan"><code>@Cayan</code></a></li> <li>Guillaume DROUARD</li> <li>Michael Doyle <a href="https://github.com/MichaelDoyle"><code>@MichaelDoyle</code></a></li> <li>Максим Иванов</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/angular-eslint/angular-eslint/blob/main/packages/angular-eslint/CHANGELOG.md">angular-eslint's changelog</a>.</em></p> <blockquote> <h2>22.6.0 (2026-10-11)</h2> <p>This was a version bump only for angular-eslint to align it with other projects, there were no code changes.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/angular-eslint/angular-eslint/commit/7722ad2ab4da81568f19a7a29a3951fa443bf22c"><code>7722ad2</code></a> chore(release): publish 22.6.0</li> <li>See full diff in <a href="https://github.com/angular-eslint/angular-eslint/commits/v22.6.0/packages/angular-eslint">compare view</a></li> </ul> </details> <br /> Updates `eslint-plugin-prettier` from 5.5.6 to 5.5.7 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/prettier/eslint-plugin-prettier/releases">eslint-plugin-prettier's releases</a>.</em></p> <blockquote> <h2>v5.5.7</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/prettier/eslint-plugin-prettier/pull/796">#796</a> <a href="https://github.com/prettier/eslint-plugin-prettier/commit/7e53ecd882fe6f0f74150cb0a539776b64182b3e"><code>7e53ecd</code></a> Thanks <a href="https://github.com/OskarEichler"><code>@OskarEichler</code></a>! - Fix fallback diagnostic locations for all supported line endings.</p> </li> <li> <p><a href="https://redirect.github.com/prettier/eslint-plugin-prettier/pull/805">#805</a> <a href="https://github.com/prettier/eslint-plugin-prettier/commit/1b7c43322ce0eb3ee7495d91481613d39d97af52"><code>1b7c433</code></a> Thanks <a href="https://github.com/JounQin"><code>@JounQin</code></a>! - Report a clear error when the sync worker fails to load, so a missing <code>prettier</code> dependency now fails fast with <code>Cannot find package 'prettier'</code> instead of hanging ESLint indefinitely.</p> </li> </ul> <h3>New Contributors</h3> <ul> <li><a href="https://github.com/truongbo17"><code>@truongbo17</code></a> made their first contribution in <a href="https://redirect.github.com/prettier/eslint-plugin-prettier/pull/798">prettier/eslint-plugin-prettier#798</a></li> <li><a href="https://github.com/OskarEichler"><code>@OskarEichler</code></a> made their first contribution in <a href="https://redirect.github.com/prettier/eslint-plugin-prettier/pull/796">prettier/eslint-plugin-prettier#796</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/prettier/eslint-plugin-prettier/compare/v5.5.6...v5.5.7">https://github.com/prettier/eslint-plugin-prettier/compare/v5.5.6...v5.5.7</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/prettier/eslint-plugin-prettier/blob/main/CHANGELOG.md">eslint-plugin-prettier's changelog</a>.</em></p> <blockquote> <h2>5.5.7</h2> <h3>Patch Changes</h3> <ul> <li> <p><a href="https://redirect.github.com/prettier/eslint-plugin-prettier/pull/796">#796</a> <a href="https://github.com/prettier/eslint-plugin-prettier/commit/7e53ecd882fe6f0f74150cb0a539776b64182b3e"><code>7e53ecd</code></a> Thanks <a href="https://github.com/OskarEichler"><code>@OskarEichler</code></a>! - Fix fallback diagnostic locations for all supported line endings.</p> </li> <li> <p><a href="https://redirect.github.com/prettier/eslint-plugin-prettier/pull/805">#805</a> <a href="https://github.com/prettier/eslint-plugin-prettier/commit/1b7c43322ce0eb3ee7495d91481613d39d97af52"><code>1b7c433</code></a> Thanks <a href="https://github.com/JounQin"><code>@JounQin</code></a>! - Report a clear error when the sync worker fails to load, so a missing <code>prettier</code> dependency now fails fast with <code>Cannot find package 'prettier'</code> instead of hanging ESLint indefinitely.</p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/prettier/eslint-plugin-prettier/commit/e6dd27a4e4015748b2e87c646be2c1a530789343"><code>e6dd27a</code></a> chore: keep packageManager when cleaning package.json for release (<a href="https://redirect.github.com/prettier/eslint-plugin-prettier/issues/808">#808</a>)</li> <li><a href="https://github.com/prettier/eslint-plugin-prettier/commit/7544956b642d4e653c235d178432e4d60a312b6b"><code>7544956</code></a> chore: release eslint-plugin-prettier (<a href="https://redirect.github.com/prettier/eslint-plugin-prettier/issues/799">#799</a>)</li> <li><a href="https://github.com/prettier/eslint-plugin-prettier/commit/e3e52386bd8ab1604d4d41ecd961de5e6749eed8"><code>e3e5238</code></a> ci: enable npm publish provenance for changesets v3 (<a href="https://redirect.github.com/prettier/eslint-plugin-prettier/issues/807">#807</a>)</li> <li><a href="https://github.com/prettier/eslint-plugin-prettier/commit/7c923c41069c939d6c6c8b7cfcad8f6a266f5276"><code>7c923c4</code></a> build(deps): Bump http-cache-semantics from 4.2.0 to 4.3.0 (<a href="https://redirect.github.com/prettier/eslint-plugin-prettier/issues/806">#806</a>)</li> <li><a href="https://github.com/prettier/eslint-plugin-prettier/commit/1b7c43322ce0eb3ee7495d91481613d39d97af52"><code>1b7c433</code></a> fix: bump synckit to surface worker failures instead of hanging (<a href="https://redirect.github.com/prettier/eslint-plugin-prettier/issues/805">#805</a>)</li> <li><a href="https://github.com/prettier/eslint-plugin-prettier/commit/a6b3feb3ce5d0bf785ddf4a83d24cf6a5c4bb902"><code>a6b3feb</code></a> docs: explain line endings and <code>endOfLine</code> behavior (<a href="https://redirect.github.com/prettier/eslint-plugin-prettier/issues/804">#804</a>)</li> <li><a href="https://github.com/prettier/eslint-plugin-prettier/commit/2f6ba1dca350a40857884103a7bf0e74b64901f7"><code>2f6ba1d</code></a> ci: exercise the getLocFromIndex ponyfill on ESLint 9 (<a href="https://redirect.github.com/prettier/eslint-plugin-prettier/issues/803">#803</a>)</li> <li><a href="https://github.com/prettier/eslint-plugin-prettier/commit/cf1d2c5cffb7520d28fe680603cc4906ada0816f"><code>cf1d2c5</code></a> chore(deps): update (<a href="https://redirect.github.com/prettier/eslint-plugin-prettier/issues/802">#802</a>)</li> <li><a href="https://github.com/prettier/eslint-plugin-prettier/commit/9f14a554f9737b1b985e2b26501d3bb2defac920"><code>9f14a55</code></a> chore(deps): update all dependencies (<a href="https://redirect.github.com/prettier/eslint-plugin-prettier/issues/788">#788</a>)</li> <li><a href="https://github.com/prettier/eslint-plugin-prettier/commit/7e53ecd882fe6f0f74150cb0a539776b64182b3e"><code>7e53ecd</code></a> fix: map fallback source locations to actual line starts (<a href="https://redirect.github.com/prettier/eslint-plugin-prettier/issues/796">#796</a>)</li> <li>Additional commits viewable in <a href="https://github.com/prettier/eslint-plugin-prettier/compare/v5.5.6...v5.5.7">compare view</a></li> </ul> </details> <br /> Updates `ngx-markdown` from 22.1.0 to 22.1.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/jfcere/ngx-markdown/releases">ngx-markdown's releases</a>.</em></p> <blockquote> <h2>v22.1.1</h2> <h2>Security fixes</h2> <ul> <li>build(deps): bump fast-uri from 3.1.6 to 3.1.8 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/jfcere/ngx-markdown/pull/695">jfcere/ngx-markdown#695</a></li> <li>build(deps): bump ip-address from 10.7.0 to 10.7.2 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/jfcere/ngx-markdown/pull/696">jfcere/ngx-markdown#696</a></li> <li>build(deps-dev): bump brace-expansion from 1.1.18 to 1.1.21 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/jfcere/ngx-markdown/pull/697">jfcere/ngx-markdown#697</a></li> <li>build(deps): bump dompurify from 3.4.14 to 3.4.16 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/jfcere/ngx-markdown/pull/698">jfcere/ngx-markdown#698</a></li> <li>build(deps): bump hono from 4.13.5 to 4.13.13 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/jfcere/ngx-markdown/pull/700">jfcere/ngx-markdown#700</a></li> <li>build(deps): bump proxy-addr from 2.0.7 to 2.0.8 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/jfcere/ngx-markdown/pull/704">jfcere/ngx-markdown#704</a></li> <li>build(deps): bump source-map-js from 1.2.1 to 1.2.2 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/jfcere/ngx-markdown/pull/706">jfcere/ngx-markdown#706</a></li> <li>build(deps): support KaTeX 0.18 in the library by <a href="https://github.com/jfcere"><code>@jfcere</code></a> in <a href="https://redirect.github.com/jfcere/ngx-markdown/pull/708">jfcere/ngx-markdown#708</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/jfcere/ngx-markdown/compare/v22.1.0...v22.1.1">https://github.com/jfcere/ngx-markdown/compare/v22.1.0...v22.1.1</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/jfcere/ngx-markdown/commit/fa3fedee0f44dc7284702e96bfd2d8a31ee11c90"><code>fa3fede</code></a> 22.1.1</li> <li><a href="https://github.com/jfcere/ngx-markdown/commit/07045853ea4cb9655eb1a9aee2b7bcafa60528a6"><code>0704585</code></a> build(deps): support KaTeX 0.18 in the library (<a href="https://redirect.github.com/jfcere/ngx-markdown/issues/708">#708</a>)</li> <li><a href="https://github.com/jfcere/ngx-markdown/commit/8557332b7410d0539c3d5ebee1f8c7ade58e89c9"><code>8557332</code></a> build(deps): bump source-map-js from 1.2.1 to 1.2.2 (<a href="https://redirect.github.com/jfcere/ngx-markdown/issues/706">#706</a>)</li> <li><a href="https://github.com/jfcere/ngx-markdown/commit/52e196ea557a9f4c91ad4df55856782741507f29"><code>52e196e</code></a> build(deps): bump proxy-addr from 2.0.7 to 2.0.8 (<a href="https://redirect.github.com/jfcere/ngx-markdown/issues/704">#704</a>)</li> <li><a href="https://github.com/jfcere/ngx-markdown/commit/3f44676ffd0b497900b47f889d58e76f39684091"><code>3f44676</code></a> build(deps): bump hono from 4.13.5 to 4.13.13 (<a href="https://redirect.github.com/jfcere/ngx-markdown/issues/700">#700</a>)</li> <li><a href="https://github.com/jfcere/ngx-markdown/commit/fe53b1fc9b3c6cbc959c6736043134c3245d4b7c"><code>fe53b1f</code></a> build(deps): bump dompurify from 3.4.14 to 3.4.16 (<a href="https://redirect.github.com/jfcere/ngx-markdown/issues/698">#698</a>)</li> <li><a href="https://github.com/jfcere/ngx-markdown/commit/638380492954c1f8cf20785aa696dd230b58c107"><code>6383804</code></a> build(deps-dev): bump brace-expansion from 1.1.18 to 1.1.21 (<a href="https://redirect.github.com/jfcere/ngx-markdown/issues/697">#697</a>)</li> <li><a href="https://github.com/jfcere/ngx-markdown/commit/d0708657315031a95e98a8416ee2dc5fb05272be"><code>d070865</code></a> build(deps): bump ip-address from 10.7.0 to 10.7.2 (<a href="https://redirect.github.com/jfcere/ngx-markdown/issues/696">#696</a>)</li> <li><a href="https://github.com/jfcere/ngx-markdown/commit/60e268a2099a858c5354f1fea768b87db0563fec"><code>60e268a</code></a> build(deps): bump fast-uri from 3.1.6 to 3.1.8 (<a href="https://redirect.github.com/jfcere/ngx-markdown/issues/695">#695</a>)</li> <li>See full diff in <a href="https://github.com/jfcere/ngx-markdown/compare/v22.1.0...v22.1.1">compare view</a></li> </ul> </details> <br /> Updates `prettier` from 3.9.9 to 3.9.10 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/prettier/prettier/releases">prettier's releases</a>.</em></p> <blockquote> <h2>3.9.10</h2> <ul> <li>Markdown: Update <code>micromark-extension-gfm-table</code> to fix the table parse issue on performance (<a href="https://redirect.github.com/prettier/prettier/pull/20266">#20266</a> by <a href="https://github.com/fisker"><code>@fisker</code></a>)</li> </ul> <p>🔗 <a href="https://github.com/prettier/prettier/blob/3.9.10/CHANGELOG.md#3910">Changelog</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/prettier/prettier/blob/main/CHANGELOG.md">prettier's changelog</a>.</em></p> <blockquote> <h1>3.9.10</h1> <p><a href="https://github.com/prettier/prettier/compare/3.9.9...3.9.10">diff</a></p> <h4>Markdown: Update <code>micromark-extension-gfm-table</code> to fix the table parse issue on performance (<a href="https://redirect.github.com/prettier/prettier/pull/20266">#20266</a> by <a href="https://github.com/fisker"><code>@fisker</code></a>)</h4> <p>See <a href="https://github.com/micromark/micromark-extension-gfm-table/commit/4f43ead37b786bc531d924530d4ab4c714886267">https://github.com/micromark/micromark-extension-gfm-table/commit/4f43ead37b786bc531d924530d4ab4c714886267</a> for details.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/prettier/prettier/commit/1172b82c295c4f889fd787dc6c78c3e194ebf353"><code>1172b82</code></a> Release 3.9.10</li> <li><a href="https://github.com/prettier/prettier/commit/d0142273aff2c76f8a69785d42ee2cedc4b0aaa3"><code>d014227</code></a> Update <code>micromark-extension-gfm-table</code> to fix the table parse issue on perfor...</li> <li><a href="https://github.com/prettier/prettier/commit/953b9084329dcd06ed1072a04b333f1e6e9371e8"><code>953b908</code></a> Bump Prettier dependency to 3.9.9</li> <li><a href="https://github.com/prettier/prettier/commit/ad8a6bf4fa23c42fd114683fec43b28a11bd24af"><code>ad8a6bf</code></a> Clean changelog_unreleased</li> <li>See full diff in <a href="https://github.com/prettier/prettier/compare/3.9.9...3.9.10">compare view</a></li> </ul> </details> <br /> Updates `typescript-eslint` from 8.71.1 to 8.72.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/releases">typescript-eslint's releases</a>.</em></p> <blockquote> <h2>v8.72.0</h2> <h2>8.72.0 (2026-10-19)</h2> <h3>🚀 Features</h3> <ul> <li><strong>eslint-plugin:</strong> lazy load rules (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13010">#13010</a>)</li> <li><strong>eslint-plugin:</strong> [await-thenable] add <code>allowMixedPromiseArrays</code> option (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12992">#12992</a>)</li> <li><strong>typescript-estree:</strong> error on abstract keyword that precedes export (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13019">#13019</a>)</li> </ul> <h3>🩹 Fixes</h3> <ul> <li><strong>ast-spec:</strong> add <code>JSXFragment</code> to <code>JSXAttribute['value']</code> (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13051">#13051</a>)</li> <li><strong>eslint-plugin:</strong> [prefer-readonly-parameter-types] check where allowed type aliases are declared (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13016">#13016</a>)</li> <li><strong>eslint-plugin:</strong> [no-deprecated] report deprecated properties in object literals (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12704">#12704</a>)</li> <li><strong>eslint-plugin:</strong> use isTypeLiteralType instead of type.isLiteral() to include bigint literals on TS < 5.0 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13053">#13053</a>)</li> <li><strong>eslint-plugin:</strong> [require-array-sort-compare] check tuples (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13058">#13058</a>)</li> <li><strong>eslint-plugin:</strong> [require-array-sort-compare] ignore extra this type argument on TS < 5.1 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13055">#13055</a>)</li> <li><strong>type-utils:</strong> discriminateAnyType crashes when calling getAwaitedType on awaited type in TS < 5.0 (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/13054">#13054</a>)</li> <li><strong>typescript-estree:</strong> include leading and trailing comments & whitespace in Program range (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12991">#12991</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Evyatar Daud <a href="https://github.com/StyleShit"><code>@StyleShit</code></a></li> <li>Junichiro Kasuya <a href="https://github.com/jksy"><code>@jksy</code></a></li> <li>Mitch Fultz <a href="https://github.com/fitchmultz"><code>@fitchmultz</code></a></li> <li>Shaan GS <a href="https://github.com/ShaanGS"><code>@ShaanGS</code></a></li> </ul> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.72.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> <h2>v8.71.2</h2> <h2>8.71.2 (2026-10-12)</h2> <h3>🩹 Fixes</h3> <ul> <li><strong>eslint-plugin:</strong> [no-unused-vars] avoid false-positives when not using our parser (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12989">#12989</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-type-parameters] count instantiated mapped type templates (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12974">#12974</a>)</li> <li><strong>eslint-plugin:</strong> [no-unused-vars] ignore type-only refs for after-used (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12977">#12977</a>)</li> <li><strong>eslint-plugin:</strong> [no-unnecessary-type-parameters] parenthesize constraint in optional tuple elements (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12995">#12995</a>)</li> <li><strong>eslint-plugin:</strong> [prefer-optional-chain] safe fix when the chain ends with a strict null comparison (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12805">#12805</a>)</li> <li><strong>type-utils:</strong> match linked packages and packages with missing version in <code>TypeOrValueSpecifier</code> (<a href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/12948">#12948</a>)</li> </ul> <h3>❤️ Thank You</h3> <ul> <li>Abraham Guo</li> <li>Brad Zacher <a href="https://github.com/bradzacher"><code>@bradzacher</code></a></li> <li>Evyatar Daud <a href="https://github.com/StyleShit"><code>@StyleShit</code></a></li> <li>Josh Goldberg</li> <li>Vinccool96</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md">typescript-eslint's changelog</a>.</em></p> <blockquote> <h2>8.72.0 (2026-10-19)</h2> <p>This was a version bump only for typescript-eslint to align it with other projects, there were no code changes.</p> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.72.0">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> <h2>8.71.2 (2026-10-12)</h2> <p>This was a version bump only for typescript-eslint to align it with other projects, there were no code changes.</p> <p>See <a href="https://github.com/typescript-eslint/typescript-eslint/releases/tag/v8.71.2">GitHub Releases</a> for more information.</p> <p>You can read about our <a href="https://typescript-eslint.io/users/versioning">versioning strategy</a> and <a href="https://typescript-eslint.io/users/releases">releases</a> on our website.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/a4c2603d3e4fd43b33bc25b82457716e9f7cef71"><code>a4c2603</code></a> chore(release): publish 8.72.0</li> <li><a href="https://github.com/typescript-eslint/typescript-eslint/commit/7488d681f6e0e96c2aaa1eee9c3d1b9b1ef077cb"><code>7488d68</code></a> chore(release): publish 8.71.2</li> <li>See full diff in <a href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.72.0/packages/typescript-eslint">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Starosdev <eder@staros.dev>
## Summary Links stable and beta server and collector version badges to their matching GitHub release pages. Development and git-describe versions remain plain badges. ## Type of Change - [x] New feature (non-breaking change that adds functionality) ## Related Issues Fixes #916 ## Changes Made - Added release URL handling for stable and beta release versions. - Opened version links in a new tab with `rel="noopener"`. - Added coverage for release and development version formats. ## Testing - `npm run lint` — passed with 0 errors; 3 warnings remain in unrelated existing files. - `npm test -- --watch=false --browsers=ChromeHeadless` — 218 passed. - `npm run build:prod` — passed; warnings were in unrelated existing areas. - `git diff --check` — passed. ## Checklist - [x] My code follows the project's code style - [x] I have performed a self-review of my code - [x] I have added/updated tests that prove my change works - [x] All existing tests pass Co-authored-by: Starosdev <eder@staros.dev>
) ## Summary The dashboard's Run collectors action starts ZFS and MDADM whenever their binaries are installed, even when those optional collectors are not enabled. On a host without ZFS access, this produces a misleading pool-list failure. Manual runs now use the all-in-one image's existing enablement conditions and log disabled collectors as skipped. ## Type of Change - [x] Bug fix (non-breaking change that fixes an issue) - [ ] New feature (non-breaking change that adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [x] Documentation update - [ ] Refactoring (no functional changes) - [ ] CI/CD or infrastructure change ## Related Issues / Linked Issues Related to #1014 and #1029. This fixes the separate optional-collector behavior discovered during live acceptance of #1029. No separate tracking issue exists. ## Changes Made - Reuse collector metadata to check ZFS and MDADM schedule/startup settings before launching binaries. Preserve SMART's default execution and one-shot arguments. - Match startup boolean normalization, including quoted environment-file values. A configured schedule still enables manual runs when startup is false. - Keep enabled-collector errors visible and document optional collector settings. ## Testing / Test plan - [x] I have tested this locally - [x] I have added/updated tests that prove my fix/feature works - [x] All existing tests pass (focused suites and all 19 current CI checks passed) Passed: - `go test -race ./webapp/backend/pkg/web/handler ./collector/pkg/omnibus` - `go vet ./webapp/backend/pkg/web/handler ./collector/pkg/omnibus` - `go mod vendor` and golangci-lint v2.14.0 with `--timeout=5m --new-from-rev=HEAD`: 0 issues before commit - `git diff --check` and pre-commit checks Fifteen executable-fixture scenarios cover disabled collectors, separate ZFS/MDADM enablement, normalized startup values, schedules with startup disabled, and enabled failures. They retain coverage of SMART one-shot arguments and API settings. The two disabled-collector cases failed against the original implementation before the fix. The follow-up adds double-quoted, single-quoted, padded, and whitespace-only empty schedule cases, plus quoted real schedules and startup enablement with an empty schedule. Four cases failed before the repair. Race tests, vet, golangci-lint v2.14.0, and pre-commit checks passed after it. All 19 CI checks passed at `5cdc73e57414bd0de758987b220043f1ccca81e6`, with none pending. ## Checklist - [x] My code follows the project's code style - [x] I have performed a self-review of my code - [x] I have commented my code where necessary (particularly complex areas) - [x] I have updated the documentation if needed - [x] My changes generate no new warnings - [x] No console.log, debug statements, or commented-out code ## Screenshots (if applicable) Not applicable. No visual changes. ## Additional Notes Review: required (user-requested independent review). Review at 59d5f73 returned FIX_FIRST for quoted-empty schedules. Commit 5cdc73e trims surrounding schedule quotes and whitespace; fresh read-only review is pending at that head. Target: develop. No dependency changes or cross-repository dependencies. Updated binaries/images require deployment before running instances gain this behavior. This follow-up has not been deployed or tested live. No merge or deployment is authorized.
feat(release): promote collector fixes and dashboard release links
## [1.77.0](v1.76.9...v1.77.0) (2026-10-25)
…1040) ## Summary Extracts the benchmark headroom rule into a function that can be tested without a filesystem, so `Test Backend` stops failing on CI runners whose temporary directory is backed by tmpfs and the rule stays covered on every runner. ## Type of Change - [x] Bug fix (non-breaking change that fixes an issue) ## Related Issues Fixes #1038. Unblocks `Test Backend` on #1037, which is where the failure surfaced. ## Reason `isMountPointSuitable` returns the mount-entry rejection at `collector/pkg/performance/mount_linux.go:37`, before it reaches the free-space branch at `:50`. `TestIsMountPointSuitable_RequiresHeadroomAboveTestFile` called it with `t.TempDir()` and asserted the reason contains `insufficient space`, so on a runner whose temporary directory is tmpfs the tmpfs rejection returned first: ``` mount_linux_test.go:260: Error: "filesystem type is tmpfs (device not mounted as a real filesystem)" does not contain "insufficient space" --- FAIL: TestIsMountPointSuitable_RequiresHeadroomAboveTestFile (0.00s) ``` The outcome depended on which runner the job landed on rather than on the code under test. On #1037, whose diff touches only `collector/pkg/mdadm/detect/` and two files under `docs/`, the same commit content passed one run and failed the next two. Skipping on an unsuitable directory stops the failure but leaves the rule uncovered. `.github/workflows/ci.yaml` runs `ubuntu-latest`, whose `/tmp` is tmpfs, so the assertion would not execute in CI at all, and the strings `insufficient space` and `headroom` appear nowhere else under `collector/`. A skip-only fix would have made a format-string regression invisible. ## Changes Made - `collector/pkg/performance/mount_linux.go`: extract `spaceRejection(availableBytes, requiredBytes uint64) string`, which `isMountPointSuitable` now calls. Behavior and message text are unchanged. - `collector/pkg/performance/mount_linux_test.go`: new `TestSpaceRejection` exercises the rule directly, with no filesystem involved, so it runs on every runner. It pins the boundary at exactly enough and one byte short, and asserts the message names the shortfall and the headroom. - The existing integration test stays, as a check that `isMountPointSuitable` still consults the rule. It skips only when the directory is rejected for a reason other than space: an `insufficient space` rejection means the space check ran, so it is no longer a reason to skip. That last carve-out fixes a second defect. With `requiredBytes=1` and `spaceHeadroomBytes` at 64 MiB, the probe fails on any filesystem with under ~64 MiB free, so a real but nearly-full runner would have skipped even though the `1<<60` assertion would have held. ## Testing - [x] I have tested this locally - [x] I have added/updated tests that prove my fix/feature works - [x] All existing tests pass ``` gofmt -l collector/pkg/performance/ # clean GOOS=linux GOARCH=amd64 go vet ./collector/pkg/performance/ # clean GOOS=linux GOARCH=amd64 go test -c ./collector/pkg/performance/ # compiles ``` `mount_linux.go` and its test are Linux-only, and this host is macOS with no container runtime available, so the tests could not be executed locally; the commands above are the limit of what the dev host can verify. CI is the execution check. What CI now demonstrates that it could not before: `TestSpaceRejection` touches no filesystem, so it runs and asserts on `ubuntu-latest` rather than skipping. The integration test still reports `SKIP` there, and that is expected. ## Checklist - [x] My code follows the project's code style - [x] I have performed a self-review of my code - [x] I have commented my code where necessary (particularly complex areas) - [x] I have updated the documentation if needed - [x] My changes generate no new warnings - [x] No console.log, debug statements, or commented-out code ## Additional Notes Review: required (this revision changes `collector/pkg/performance/mount_linux.go`, so it is no longer test-only, and a push to `develop` publishes the testing image). The change is a pure extraction with no behavior or message change, and `spaceRejection` has one caller. An earlier revision of this PR claimed the assertion would run on a runner with a real filesystem and that stubbing `statfs` was the natural follow-up. Both were wrong and are corrected here: no current runner provides a real-filesystem temporary directory, and the `statfs not stubbed` helper referenced is in `collector/pkg/btrfs`, a different package, which would not have helped anyway because the tmpfs rejection precedes the `statfs` call.
## Summary Drives that support the SCSI Verify Error Counter log page (0x05) report the same seven counters as the read and write pages, but Scrutiny decoded only read and write, so the verify counters never reached the attribute table or its history. This is the first of three stacked PRs for #1024. It adds a `verify_*` attribute per counter, plus `verify_gigabytes_processed`. ## Type of Change - [ ] Bug fix (non-breaking change that fixes an issue) - [x] New feature (non-breaking change that adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update - [ ] Refactoring (no functional changes) - [ ] CI/CD or infrastructure change ## Related Issues Related to #1024. The issue asks for five groups of SCSI/SAS fields; this PR delivers group 4 (verify error counters). It is not a complete fix for the issue, so it carries no closing keyword. Builds on the SCSI work in #848, and relates to #919 and #470. ## Changes Made - Decode the Verify Error Counter log page. The read, write and verify pages share one named `ScsiErrorCounters` type, replacing the two duplicated anonymous structs. - `Verify` is a pointer, so a drive that does not support the page gets no verify attributes at all, rather than seven permanently-zero ones that a value type could not tell apart from a drive reporting real all-zero counters. - Seven new attributes with display metadata: the six counters plus `verify_gigabytes_processed`. - Define the SCSI attribute set once. `ProcessScsiSmartInfo` (the legacy InfluxDB migration path) and `processScsiSmartInfoWithOverrides` (ingestion) now share one `buildScsiAttributes` helper instead of carrying two copies of the same map, which is what made adding a page mean editing two places. - Read and write attribute IDs, values and thresholds are unchanged. Verified by extracting every `(AttributeId, Threshold)` pair before and after and comparing. ### Deliberately not included - Replacement-risk weights are untouched. `ScsiReplacementRiskWeights` sums to 100, so adding a verify signal means rebalancing a table that moves the risk score of every SAS drive. That deserves its own change. - Verify counters are recorded without threshold evaluation in this PR. The follow-up PR turns them on together with the delta-based evaluation that makes a cumulative counter safe to judge. ## Testing - [ ] I have tested this locally - [x] I have added/updated tests that prove my fix/feature works - [ ] All existing tests pass To be explicit about the two unchecked boxes: the Go test suite was **not** run locally, by operator policy on this machine, so CI is the first run of it. What was checked locally: - `go build ./webapp/...` and `go vet` over the changed packages: clean. - `golangci-lint` v2.14.0, the version CI pins, run two ways: `--new-from-rev=origin/develop` from the real worktree path, and a full-module run cross-checked against this branch's diff line ranges. Both report zero findings on changed lines. This caught `fieldalignment` findings on the new structs, which are fixed here. - New tests: `TestFromCollectorSmartInfo_Scsi_Verify_ErrorCounters` (counter values, thresholds, metadata coverage for every emitted attribute ID) and `TestFromCollectorSmartInfo_Scsi_Verify_Absent` (a drive without the page gets no verify attributes and keeps its existing 16-attribute set). - New fixture `smart-scsi-sas-verify.json`: the existing Seagate `smart-scsi.json` plus a verify page. The field names and two of the values (`correction_algorithm_invocations` 7054, `gigabytes_processed` "0.000") come from the `smartctl-ultrastar-sas-samples.json` attachment on the issue; the three error counts are synthetic, chosen so the test exercises a nonzero recovered-error path. ## Checklist - [x] My code follows the project's code style - [x] I have performed a self-review of my code - [x] I have commented my code where necessary (particularly complex areas) - [x] I have updated the documentation if needed - [x] My changes generate no new warnings - [x] No console.log, debug statements, or commented-out code `TESTING.md`'s fixture inventory gains a row for the new fixture. The OpenAPI collector schema is updated in the third PR of the stack, in one place for all three pages. ## Additional Notes Review: required (merging to `develop` publishes the testing image through `deploy-testing.yml`, with no separate deploy step). Merge order matters: this PR is the base of `feat/1024-sas-phy-counters`, which is the base of `feat/1024-scsi-lifetime-counters`. Merge this one first. Why the verify counters are not thresholded yet, in one line: they are cumulative and commonly already nonzero on a healthy drive, so failing a drive on an absolute value would alarm existing SAS users on upgrade over errors that may be years old.
## Summary smartctl reports the SAS Protocol log page as one numbered top-level key per port, each holding one numbered key per PHY, so there was no field to decode it into and the counters were dropped entirely. This is the second of three stacked PRs for #1024. It exposes four error counters per PHY plus the negotiated link rate, and generalizes delta-based evaluation beyond ATA so those counters can be judged by trend. **Base is `feat/1024-scsi-verify-counters`, not `develop`.** Review only the top commit; the diff against `develop` includes the first PR. ## Type of Change - [ ] Bug fix (non-breaking change that fixes an issue) - [x] New feature (non-breaking change that adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update - [ ] Refactoring (no functional changes) - [ ] CI/CD or infrastructure change ## Related Issues Related to #1024, delivering group 1 (SAS connectivity and PHY errors). No closing keyword: the issue has five groups. ## Changes Made - Collect the per-port, per-PHY counters in the raw decode pass that already extracts the numbered `scsi_self_test_N` keys. Invalid DWORDs, running disparity errors, loss of DWORD synchronization, PHY reset problems, and the negotiated link rate in Mbps. - Attribute IDs are per PHY (`sas_port_0_phy_0_invalid_dword_count`), because that is what makes one bad cable, backplane slot or HBA port identifiable. Combining a drive's ports would average the fault away. - A PHY with nothing attached still reports real counters, so nothing is filtered. A PHY that reports no speed (`"phy enabled; unknown"`) gets no link rate attribute rather than a misleading zero. - Attribute metadata is resolved through `ScsiMetadataFor`, which fills the port and PHY numbers into a per-counter template, and the device details response sends only the entries the device's own attributes need. This supports any number of ports and PHYs without enumerating them in a static map. - Delta evaluation generalized: `ApplyDeltaEvaluation` is no longer gated on the ATA protocol, and which attributes it acts on is decided by a type switch plus the `UseDeltaEvaluation` metadata flag. NVMe, FARM and ATA device-statistics attributes are unaffected, and read/write uncorrected errors keep failing on their absolute value because those are media errors the host actually hit. - `extractPreviousEvaluatedValues` (was `extractPreviousRawValues`) uses `AttributeThresholdValue`, so the value compared across submissions is the one the threshold is applied to, for every protocol rather than ATA alone. - Fixes a live bug in the process: a load-bearing user override now beats delta suppression. An override row that sets no action and no threshold does nothing, and correctly does not disable suppression. Previously a `fail_above` or `force_status` result could be silently downgraded to passed once the counter stopped moving, which contradicted the rule that an explicit user rule decides an attribute's status. That affected ATA attribute 199 too. - Turns on the verify counter thresholds that the first PR deliberately left off, now that trend evaluation exists for SCSI. ### Known behavior to weigh A counter the previous submission did not report is deliberately **not** suppressed. The previous submission can lack it because the drive failed to report that log page once, and on a marginal SAS link that is exactly when the page read times out, so suppressing would let a counter climb unseen across alternating collections. The consequence: a drive whose PHY or verify counters are already nonzero fails on the first collection that records them, **and sends one notification**, then clears on the next collection if the counters do not move. That matches how ATA attribute 199 already behaves. An earlier revision of this branch suppressed the first sighting instead; it was removed because the masking risk disables its own detector. Being precise about the cost, because the two readings are not the same: it is one failure *per drive* when the log page reads reliably, which is the normal case. In the pathological case the justification invokes — a link so marginal that the page read itself times out on alternating collections — the attribute never has a previous value and so fails every time it appears. The real fix for that is to source previous values from the most recent submission that *carried* each attribute rather than from the immediately previous submission only, which is a repository-query change worth its own PR. Filed as follow-up rather than bundled here. `verify_total_uncorrected_errors` is deliberately **not** delta-evaluated, unlike the four PHY counters and `verify_errors_corrected_by_rereads_rewrites`. An uncorrected verify error is an unreadable block the drive found on its own — the same class of defect as a read or write uncorrected error, which Scrutiny has always failed on its absolute value. A trend guard there would mean a drive with known-bad blocks reads healthy as soon as the count stops climbing. ## Testing - [ ] I have tested this locally - [x] I have added/updated tests that prove my fix/feature works - [ ] All existing tests pass The Go test suite was **not** run locally, by operator policy on this machine; CI is its first run. Checked locally: - `go build ./webapp/...` and `go vet` over the changed packages: clean. - `golangci-lint` v2.14.0, the version CI pins: `--new-from-rev` against this branch's own base from the real worktree path, plus a full-module run cross-checked against the diff's line ranges. Zero findings on changed lines. - New tests: per-PHY attribute values and separation between ports, the link-rate parse table including the non-numeric states, generated metadata resolution (`Invalid DWORDs (Port 1 PHY 0)`), SCSI delta suppression and non-suppression, first-sighting non-suppression, override-beats-delta, and that read/write uncorrected errors are not delta-evaluated. - New fixture `smart-scsi-sas-phy.json`: two SAS ports, port 1 with nothing attached, values from the Ultrastar sample on the issue. ## Checklist - [x] My code follows the project's code style - [x] I have performed a self-review of my code - [x] I have commented my code where necessary (particularly complex areas) - [x] I have updated the documentation if needed - [x] My changes generate no new warnings - [x] No console.log, debug statements, or commented-out code `TESTING.md`'s fixture inventory gains a row for the new fixture. OpenAPI schema updates for all three pages land in the third PR of the stack. ## Additional Notes Review: required (merging to `develop` publishes the testing image through `deploy-testing.yml`, with no separate deploy step). Merge after `feat/1024-scsi-verify-counters` and before `feat/1024-scsi-lifetime-counters`. The delta-evaluation change is the highest-risk part of this PR, since it touches the shared ATA path. The existing `smart_delta_test.go` cases all still describe current behavior and pin it, and this PR adds the ATA `force_status` case the override fix needed. This PR also fixes a latent nil-interface panic in `notify.go` that it would otherwise have made routine: `Attributes` is a map of interfaces, so a failing attribute the previous submission never carried yielded a nil `SmartAttribute`, and reading a value off it panicked. That is exactly the shape of a release decoding a log page it previously ignored. Covered by a new notify test. ### Known follow-ups, not in this PR - Previous-value sourcing, as above. - `notify.go`'s ignore check consults config-file overrides only, not database-stored ones, so a database `ignore` on an attribute suppresses its status but not its notification. Pre-existing, and more visible now that an override is the documented escape hatch. - `read`/`write_errors_corrected_by_rereads_rewrites` are not delta-evaluated while their verify twin is. Pre-existing asymmetry, now visible in one file.
…r counters (#1045) ## Summary Three more SCSI log pages reach the attribute table and its history: Background Medium Scan status (0x15), the Environmental Reports lifetime temperature extremes, and the Start-Stop Cycle Counter (0x0e). Two of the three were already decoded and had no consumer at all. This is the third of three stacked PRs for #1024. **Base is `feat/1024-sas-phy-counters`, not `develop`.** Review only the top commit. ## Type of Change - [ ] Bug fix (non-breaking change that fixes an issue) - [x] New feature (non-breaking change that adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update - [ ] Refactoring (no functional changes) - [ ] CI/CD or infrastructure change ## Related Issues Related to #1024, delivering groups 2 and 3. Still no closing keyword, because group 5 is not implemented; see below. ## Changes Made - Background Medium Scan: scans performed, medium scans performed, the numeric status code and the scan progress percentage. The drive runs this scan on its own schedule, independently of Scrutiny's self-tests, so the scan counts are how a user sees whether it is still checking its own media; a count that stops rising means scanning is disabled or never completing. None of the four is treated as a verdict, because the errors a scan finds are counted by the verify error counters. - Environmental Reports: lifetime and since-power-on temperature maxima and minima, one attribute set per reported sensor. The drive tracks these itself, so they cover the whole life of the drive rather than the window Scrutiny has been watching, and they survive any gap in collection. Humidity sensors of the same log page are left alone. - Start-Stop Cycle Counter: start/stop and load/unload cycles. Each accumulated counter comes with the count the manufacturer rates the drive for, so the rated count becomes the attribute's threshold and the UI reads as "44 of 50000". A drive that reports a counter without its rated limit gets no threshold rather than a zero one it would always exceed. - Every field of that page is decoded as a pointer. smartctl emits each parameter only when the drive reports it, so a drive can report start/stop cycles and omit load/unload entirely; a value type would turn that absence into a permanently-zero attribute and 7 InfluxDB fields of noise. - Documents the verify, background scan and start-stop fields in the OpenAPI collector schema, which had not been updated for any of the three PRs. - Drops the `temperature` parameter of `ProcessScsiSmartInfo`. It was never read, and the migration path it serves reconstructs attributes from pre-InfluxDB records that carry the grown defect count and the read/write error counters only. ### Design decisions worth a reviewer's attention - **Passing the rated cycle count is not reported as a failure.** Drives routinely outlive their rated cycle count, and the ATA equivalents of these counters (attributes 4, 193 and 225) are not failed either. The threshold still renders, so the wear figure is visible; a user who wants an alarm can set a `fail_above` override. An earlier revision made these critical and failable, which turned an old-but-working drive red and sent a notification under the default notify filter. - **Every temperature row names its sensor**, including the first. Suppressing "(Sensor 1)" made the first row of a multi-sensor drive read as a drive-wide figure. - **The background scan status string rides in the status reason.** An attribute value is an `int64` and cannot hold it, but `StatusReason` is already persisted, is carried through `fn: last` downsampling, and reaches the API response. Being precise about the UI, since an earlier draft of this body overstated it: the web UI surfaces that field as the **tooltip on the attribute's status**, not as a column of its own, and it is not graphable. A user override on this attribute also replaces the reason with the override's own. So group 2's four fields are all *delivered*; the string is the least prominent of them. The alternative was not recording the drive's own wording at all. - **Nothing here is delta-evaluated.** These are state and wear figures, not error counters, so a static value carries no false alarm to suppress. ### Not implemented Issue group 5, the General Statistics and Performance log page, is deliberately absent. Several of its counters read zero on the reporting user's own drives, and its logical-block counts duplicate the workload signal the read/write gigabytes-processed attributes already provide. The reporter says the same in the issue. Worth its own change if wanted. ## Testing - [ ] I have tested this locally - [x] I have added/updated tests that prove my fix/feature works - [ ] All existing tests pass The Go test suite was **not** run locally, by operator policy on this machine; CI is its first run. Checked locally: - `go build ./webapp/...` and `go vet ./webapp/backend/pkg/...`: clean. - `golangci-lint` v2.14.0, the version CI pins: `--new-from-rev` against this branch's own base from the real worktree path, plus a full-module run cross-checked against the diff's line ranges. Zero findings on changed lines. - New tests: all three log pages end to end against a realistic fixture, per-sensor metadata naming for sensors 1 and 2, and a drive used past its rated start/stop count, which pins that it stays passed while recording the rating as the threshold. - New fixture `smart-scsi-sas-full.json`: the PHY fixture plus the three new pages, values taken from the `smartctl-ultrastar-sas-samples.json` attachment on the issue. - Also new: a drive that supports the start-stop page but reports only some of its counters, which must produce no attribute for the absent one; and the other half of that decision, a counter the drive reports as zero, which must still produce an attribute. - `TESTING.md`'s fixture inventory gains rows for all three new fixtures across the stack. ### Cost of the full stack A fully-featured SAS HDD now reports 42 attributes where it reported 16, which is 298 InfluxDB fields per measurement point rather than 116. Downsampling aggregates every SMART field with `fn: last`, so the added state and wear figures keep their last observed value rather than being averaged. Nothing in the repo caps or chokes on that; the growth is linear in attributes and bounded by device count. ## Checklist - [x] My code follows the project's code style - [x] I have performed a self-review of my code - [x] I have commented my code where necessary (particularly complex areas) - [x] I have updated the documentation if needed - [x] My changes generate no new warnings - [x] No console.log, debug statements, or commented-out code ### Known wart, recorded rather than fixed The two wear counters put a rated specification into the attribute threshold, a field whose only other meaning on SCSI is a failure boundary. The web UI's default attribute filter admits any attribute whose value is below its threshold (`detail.component.ts`), so a healthy wear counter appears in the default view. The same clause admits any attribute with a negative value, since "no threshold" is `-1`, so a drive stored below freezing also shows its lifetime temperature minimum there. The rows are correct and raise nothing, but separating "rated limit" from "fail boundary" is the real fix and belongs in its own change. The test comment now says this rather than claiming the opposite. ## Additional Notes Review: required (merging to `develop` publishes the testing image through `deploy-testing.yml`, with no separate deploy step). Merge last of the three.
Links a filesystem to the physical drives beneath it so per-drive free space can be reported, closing the last gap in #470. The filesystem collector walks the kernel holder tree under /sys/class/block from each mount source down to the whole disks beneath it, so partitions, LVM, md and LUKS all resolve through one path. It skips md hot spares, which hold none of the array's data, and loop, zram and ram devices, which are not drives. A new filesystem_devices table stores one row per (filesystem, disk) pair, because the relation is many-to-many. A single free-space figure is reported for a drive only when exactly one filesystem sits on it and that filesystem sits on no other drive. Every other case shows a mount count on the card and a per-filesystem breakdown on the detail page. Shared free space is never divided between drives, because the kernel reports no such split. Repeated mounts of one filesystem, which bind mounts and btrfs subvolumes produce, collapse on the per-drive views while the per-host capacity panel keeps one row per mount. An unattributed filesystem stays unattributed, and the detail page says which reason applies rather than reporting zero bytes free. Purging a SMART host now deletes its filesystem rows alongside its devices. Known limitation, tracked in #1046: the filesystem and SMART collectors must be given the same COLLECTOR_HOST_ID, since they disagree on the default empty value. The detail page names that case when it sees it.
Route findBucketInOrg and GetAvailableInfluxDBBuckets through one forEachOrgBucket paged walk, so the paging offset advances in a single place, and assert that offset over the wire with an httptest server. api.Paging's fields are unexported, so a stub BucketsAPI cannot observe what api.PagingWithOffset set and a constant offset left the suite green while hanging startup during MigrateDatabase. Fixes #1015
## Summary Adds Unraid `/proc/mdstat` support to the MDADM collector, so Unraid-backed arrays are detected and surfaced. The standard Linux `mdadm` detection path is unchanged. ## Type of Change - [x] New feature (non-breaking change that adds functionality) - [x] Documentation update ## Related Issues Related to #538. Follow-up to #530, which fixed registration on a standard Linux host and is not reopened here. ## Reason Unraid does not use Linux MD RAID. Its own md driver writes `/proc/mdstat` as `key=value` metadata rather than the `mdX : active raidN ...` lines the detector matched, and Unraid ships no `mdadm` binary, so the `mdadm --detail` path could not run there either. An Unraid host logged `No MDADM arrays found in /proc/mdstat` even with `/host/proc/mdstat` mounted correctly. ## Changes Made - `collector/pkg/mdadm/detect/detect_unraid.go`: new parser, entered from `Start` when mdstat contains an `mdState=` line. Runs no commands. - One array per host (`unraid-array`), since an Unraid array is a single parity-protected set rather than a collection of independent arrays. The UUID is the superblock array GUID (`sbLabel`), which is stable across reboots and disk replacements; the level reports the assigned parity disk count (`unraid-parity1` / `unraid-parity2` / `unraid-noparity`). - Health comes from the per-slot `rdevStatus` values, not `mdNumDisabled`. Unraid reports an unassigned second parity slot as `DISK_NP_DSBL` and counts it, so a healthy single-parity host reads `mdNumDisabled=1`; keying health off that count would mark it degraded. - Sync progress is `mdResyncPos` over `mdResyncSize`, matching Unraid's own webgui (`/usr/local/emhttp/plugins/dynamix/nchan/parity_list`). A paused operation keeps its progress, because Unraid zeroes `mdResync` while retaining `mdResyncPos`. - State strings reuse the vocabulary the web UI already colors on (`active`, `degraded`, `inactive`, `checking`, `resync`, `recovery`), so there is no backend, API, database, or frontend change in this PR. - `collector/pkg/mdadm/detect/detect.go`: the Unraid branch at the top of `Start`, and `hostID` moved above it. No change to `parseMdstat`, `getArrayDetail`, or `mdadm --detail` handling. - Docs: `docs/INSTALL_UNRAID.md` and `docs/MDADM_MONITORING.md` replace the "Unraid is unsupported" guidance with the supported requirements, validation steps, and limits. ### Deliberate limits - `used_bytes` stays zero. Every Unraid data disk carries its own filesystem, so there is no single mount point to measure. - `raw_mdstat` keeps the array-level keys only. Unraid reports all 30 array slots, making mdstat roughly 450 lines, and `raw_mdstat` is stored on every metrics point. The per-slot data is already exposed through the array's device list and the device counters. Both are documented in `docs/INSTALL_UNRAID.md`. ## Testing - [x] I have tested this locally - [x] I have added/updated tests that prove my fix/feature works - [x] All existing tests pass ``` go build ./collector/... # clean go vet ./collector/pkg/mdadm/... # clean gofmt -l <changed files> # clean go test ./collector/pkg/mdadm/... ok github.com/analogj/scrutiny/collector/pkg/mdadm 0.273s ok github.com/analogj/scrutiny/collector/pkg/mdadm/detect 0.266s ``` 15 new tests cover the Unraid path: started, degraded, parity check running, parity check paused, stopped, missing `sbLabel`, slot classification, state vocabulary, progress clamping, and `raw_mdstat` trimming. The pre-existing Linux `mdadm` tests pass unchanged, and `TestIsUnraidMdstat` asserts a standard Linux mdstat is not claimed by the new parser. The fixtures include a sanitized copy of a live Unraid host's 450-line `/proc/mdstat` (1 parity disk, 11 data disks, empty second parity slot). Only the array GUID and the disk serials were replaced; every field the parser reads is unmodified, so the started-case assertions run against real host data. Test binding was verified by neutering the fix: relaxing the slot-presence check so `DISK_NP*` slots count as present turns 5 of the new tests red. ### Not yet validated End-to-end collection on an Unraid host is **not** verified in this PR. That needs a built collector image, which this repository produces from `develop` on merge, so it is the first check to run after this lands: ```bash docker exec -it <collector> /opt/scrutiny/bin/scrutiny-collector-mdadm run --debug curl -s http://localhost:8080/api/mdadm/summary | jq . ``` Expect `Detected Unraid-format /proc/mdstat` in the collector log and one array entry in the summary. The `mdResyncPos`/`mdResyncSize` progress math is taken from Unraid's webgui source rather than observed during a running parity check, since the reference host was idle. The percentage is the one value worth re-checking during the next parity check. ## Checklist - [x] My code follows the project's code style - [x] I have performed a self-review of my code - [x] I have commented my code where necessary (particularly complex areas) - [x] I have updated the documentation if needed - [x] My changes generate no new warnings - [x] No console.log, debug statements, or commented-out code ## Additional Notes Review: required (a push to `develop` publishes the testing image through `.github/workflows/deploy-testing.yml`, so the change takes effect on merge with no separate deploy step). A separate `collector-unraid` was considered and rejected: it would add an API group, database table, repository, frontend module, and Dockerfile target to render one card the existing MDADM page already renders. `level: unraid-parityN` already states that the array is not MD RAID. No new dependencies, so `vendor/` is unchanged. ## Review Round 1 An independent read-only review found a monitoring false negative, now fixed in `57644c9d`. Each fix carries a test that reddens when the fix is reverted; 21 Unraid tests, up from 15. **Blocking: a missing disk read back healthy.** Unraid reports an absent-but-assigned disk as `rdevStatus=DISK_NP_MISSING`, and the slot scan skipped every status carrying the `DISK_NP` prefix, so the slot dropped out entirely. `FailedDevices` stayed 0, the state read `active`, the UI painted the card green, and the backend notification condition (`FailedDevices > 0` or a `degraded` state) never fired. Confirmed against Unraid's own webgui, which renders `DISK_NP_MISSING` as "Missing" with the superblock id in `dynamix/nchan/device_list`. Presence is now two questions: a slot is *assigned* when the superblock still records an identity (`diskId` or `diskSize`), and *attached* when its status carries no `DISK_NP` prefix. Assigned but not attached is a missing disk and counts as failed; neither is an unused slot and is skipped, which keeps the empty second parity slot from reading as a failure. `mdNumMissing` is additionally applied as a floor on the failure count, so a future Unraid release that stops recording the identity of a missing disk still cannot produce a silent healthy array. **The license identifier reached the UI and notification bodies.** `sbLabel` went verbatim into `array.UUID` and stayed in `raw_mdstat`, which is rendered on the array details page, and the UUID is included in notification bodies. It derives from the flash drive GUID. The UUID is now a digest of `sbLabel` and `raw_mdstat` withholds that line. The fixtures were already sanitized for this reason; the runtime path now matches. **Parity classification broke on a stopped array.** Keying `isData` off a non-empty `diskName` was wrong, because Unraid exports an md device for a data disk only while the array is started. On a stopped array every `diskName` is empty, which would have reported `unraid-parity12` with a zero array size. Parity is now identified by slot index (0 and 29). The stopped-array test previously only swapped `mdState` and so could not catch this; it now blanks `diskName` the way a real capture does. Also fixed: `nocorrect` maps to `checking` rather than `resync`; `Start` no longer dereferences a nil `Config`; the three mdstat scans use a line iterator instead of `bufio.Scanner`, removing the silent 64 KiB truncation rather than patching the unchecked error; a negative or unparseable `diskSize` contributes nothing instead of shrinking the reported capacity. The review cleared the areas of highest concern: no regression to the Linux `mdadm` path, colon-prefixed UUIDs already ship on `develop` via `synthetic:` so the routes handle them, no disk serial or array GUID leaked into the committed fixtures, and no lint or vendor issues.
Assert the required figure numerically, as the test file size plus the headroom, so the rejection message cannot regress to implying free space is the whole budget.
Credit the sources behind SMART failure rates wherever the detail view shows them, as text and links rather than a bundled vendor logo, and derive the credit from the data instead of a fixed string. The only prior attribution was an upstream-inherited tooltip on the desktop SMART table header: hover-only, absent from the mobile cards and the Replacement Risk card, and inaccurate once consumer drive profiles shipped, because a matched profile can replace an attribute's observed-threshold buckets with values from linuxhw/SMART or a hand-authored Scrutiny profile. One shared template now renders at all three sites that display a failure rate, gated on ATA. It always credits Backblaze Drive Stats, and names an applied profile's own source only when that profile actually carries observed thresholds, which is 10 of the 35 bundled profiles. The replacement-risk response gains consumer_drive_profile_observed_thresholds to carry that distinction, documented in openapi.yaml and CONSUMER_DRIVE_PROFILES.md. Refs #494
…1050) Clears the five non-blocking notes left by the review of #1039 after it merged. The openapi description claimed "Always present", a schema guarantee the schema does not encode, and said the profile buckets replace the Backblaze-derived ones for the attributes a profile covers, which is stronger than the code: an ATA SSD whose reported attribute name does not match its metadata name skips observed-threshold scoring before the override applies. Both are corrected, and the description points at the drive-profile endpoint for the per-attribute answer. API.md summarized this response before the field existed. Its bullets now carry the applied-versus-thresholds distinction and note that observed_threshold_attributes is the per-attribute form of the same fact. The Go field records why both forms exist and when to consolidate them. The frontend's blank-source check is documented as a guard rather than a live case, because addConsumerDriveProfile rejects a blank source when the catalog loads. No behavior change.
Two workflows publish the develop and develop-omnibus tags on a push to develop, and only the Docker workflow attached OCI labels. Whichever finished last owned the tag, so the image an operator pulled carried a revision label or not depending on a race, and the documented deployment check on Zeus returned an empty string. Stamp the same labels here through docker/metadata-action.
…es (#1055) Per-drive filesystem attribution produced nothing in the omnibus container, which is how Scrutiny is normally deployed. kernelName resolved the mount source with EvalSymlinks and gave up when that failed. Inside the container /dev holds only the devices the compose file passes through, and those are whole disks, while a mount source is usually a partition or an array the container was never given: on the Zeus develop instance /dev/md1p1 is absent while /sys/class/block/md1p1 is one of 55 entries. Resolve returned nil before the holder-tree walk started, although the walk needs sysfs alone. A source naming one segment under the device root now falls back to that segment, which is the kernel name by construction. A nested source such as /dev/mapper/vg-root still requires its node, because only the symlink records what it points at. Neither path invents a device: walk looks every name up under sysfs and drops what the kernel does not know. The gap was in the fixtures as much as the code. Every blockdev test created a sysfs entry and a /dev node together, so nothing covered the shape the product runs in. TestResolve_WorksWithoutDeviceNodes removes the partition, array and mapper nodes from the fake tree and re-runs resolution through sysfs only. Closes #1054
…#1059) Per-drive filesystem free space resolved the right block devices and still attributed almost nothing on a real host, because the name the sysfs walk finds is not always the name Scrutiny registers the drive under. An NVMe filesystem resolves to a namespace, nvme0n1, while the SMART collector registers the controller, nvme0, so the join never matched and no NVMe drive could show free space on any host. The namespace is reduced to its controller, and several namespaces on one controller collapse to that single drive. An Unraid array device cannot be resolved from sysfs at all: md1p1 is a top-level virtual block device with no partition file and an empty slaves directory, so the holder tree says nothing about the disk beneath it and the walk emitted the array device itself. Unraid records the pairing in its own mdstat as diskName against rdevName, which this repo already reads and parses for the Unraid array support added in #1037. UnraidArrayDeviceMap exposes that pairing, read once per collection run, and the array device is rewritten to its disk. The pairing exists only while the array is started, so a stopped array attributes nothing rather than guessing. Both corrections live in one translation step in the filesystem collector rather than in blockdev, which stays a plain sysfs walker answering the kernel question. A translated name remains only a claim: the server attributes it to a drive only when a registered device carries that name. Measured on the Zeus develop instance at image revision 1009020, before this change: 14 of 17 filesystems attributed, but 13 of those to md1p1 through md11p1, which match no registered device, and the NVMe row to nvme0n1 against a registered nvme0. Closes #1057 Closes #1058
feat(release): promote per-drive filesystem capacity and SAS monitoring
## [1.78.0](v1.77.0...v1.78.0) (2026-10-30)
feat(release): promote MDADM array management and per-machine host ids
## [1.79.0](v1.78.0...v1.79.0) (2026-10-31)
…te coverage (#1089) ## Summary Fixes the three defects reported in #1084, all on the replacement-risk path: the trend column never scored, the value column reported a number the scorer never used, and five critical SMART attributes carried no weight at all. Reported drive: reallocated sector count raw 18 (1 at the start of the window) and Soft Read Error Rate at WARN, yet the card read `Value 0 | Score 12.5 | Trend —`, score 13, HEALTHY. ## Type of Change - [x] Bug fix (non-breaking change that fixes an issue) - [ ] New feature (non-breaking change that adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update - [ ] Refactoring (no functional changes) - [ ] CI/CD or infrastructure change ## Related Issues Fixes #1084 ## Changes Made - **Trend read the wrong end of the history slice.** `GetSmartAttributeHistory` returns entries newest-first (`scrutiny_repository_device_smart_attributes.go:82`, `sort(columns: ["_time"], desc: true)`), but `get_device_replacement_risk.go` and `replacement_risk_notify.go` both took `history[0]` as the oldest snapshot. Every trend compared the latest submission against itself and scored zero, so the trend bonus was dead in production. Both callers now share `oldestAttributesFromHistory`, which reads the last entry. - **The contributions table reported a value the scorer never used.** `contrib.Value` came from `GetTransformedValue()`, which is zero for every attribute without a metadata `Transform` (attribute 5 has none), while the score came from `RawValue`. The severity functions now return the value they scored alongside the severity, so the pair cannot diverge. Attributes scored from status report their charted value through the new `SmartAtaAttribute.DisplayValue()`, which reuses the existing display-type selector. - **Five critical attributes carried no weight.** `AtaMetadata` marks 10 attributes critical; 177, 184, 187, 188 and 201 had no entry in the weight table, so they could not reach the score or the table — a drive FAILED on 187 still scored healthy. Reported Uncorrectable Errors (187) and Command Timeout (188) are two of the five key Backblaze SMART stats and now carry curated weights; the rest of the ATA table is rebalanced so the curated total stays 100. Remaining critical attributes get a residual weight derived from metadata, so a newly critical attribute cannot be silently unscored again. - Shared `ataCounterAttributeIDs` set so static and trend scoring cannot drift on which attributes are counter-scored. - `docs/openapi.yaml`: documented what `value` and `trend_score` mean on a contribution. ### ATA weight table | Attribute | Before | After | | --- | --- | --- | | 5 Reallocated Sector Count | 25 | 22 | | 197 Current Pending Sector Count | 20 | 18 | | 198 Offline Uncorrectable | 20 | 15 | | 187 Reported Uncorrectable Errors | — | 15 | | 188 Command Timeout | — | 7 | | 196 Reallocated Event Count | 10 | 7 | | 10 Spin Retry Count | 10 | 5 | | 199 UDMA CRC Error Count | 5 | 4 | | 1 Raw Read Error Rate | 5 | 3 | | 7 Seek Error Rate | 3 | 2 | | 194 Temperature | 2 | 2 | | 177, 184, 201 (residual, status-scored) | — | 3 each | Curated weights sum to 100. Residuals push the theoretical ATA maximum to 109; the scorer already clamps the final score to 100. ## Testing - [ ] I have tested this locally - [x] I have added/updated tests that prove my fix/feature works - [ ] All existing tests pass Not run locally by request; CI `Test Backend` and `Lint Backend (Go)` are the validation of record for this PR. New tests: - `TestOldestAttributesFromHistoryReadsTheLastEntry` — newest-first history resolves to the oldest entry, nil history to nil. - `TestComputeRiskContributionsScoresTheTrendOverTheWindow` — the reported drive's 1 → 18 climb scores `+18.75` trend, total 31.25, instead of the 12.5 the old code produced. - `TestComputeRiskContributionsReportsTheValueItScored` — raw 18 with `TransformedValue` 0 reports value 18 beside score 12.5. - `TestComputeRiskContributionsReportsChartedValueForStatusScoredAttributes` — attribute 201 at WARN appears with its normalized value 23 and a non-zero score. - `TestAtaCuratedReplacementRiskWeightsSumTo100`, `TestAtaReplacementRiskWeightsCoverEveryCriticalAttribute`, `TestAtaReplacementRiskWeightsAreUniqueAndOrdered` — the metadata-derived residuals stay complete, deduplicated and deterministically ordered. ## Checklist - [x] My code follows the project's code style - [x] I have performed a self-review of my code - [x] I have commented my code where necessary (particularly complex areas) - [x] I have updated the documentation if needed - [x] My changes generate no new warnings - [x] No console.log, debug statements, or commented-out code ## Review findings addressed A review of the first pass raised eight items; seven are fixed in `488f55b3`, one is explained below. - **Residual weight on a bucketless critical attribute** (above): residuals now require observed thresholds. - **`trend_window=90d` measured up to a year.** `90d` maps to the `year` duration key, range `-1y..-1mo`, so the last history entry can predate the window by months. The oldest snapshot is now chosen by its own timestamp against a window cutoff. Latent before this branch, because the trend was always zero. - **`trend_bonus` was unclamped while `score` clamped to 100**, so a card could render `100 /100 +118 trend`. `clampRiskTotals` now clamps both, on the endpoint and the notification path. - **Invariant 26 said "replacement-risk weights sum to 100 per protocol"** and the ATA table no longer does. The invariant and the review checklist are amended to describe the curated-plus-residual shape and to say rebalancing targets the curated table. Both files are gitignored (`.gitignore:128-130`), so that edit is local to the maintainer checkout and cannot appear in this diff; it is a deliberate amendment, not an oversight. - **`summary_risk.go` repeated the ATA weights as literals** and went stale on the rebalance. It now resolves them through `thresholds.ReplacementRiskWeightFor`, with a test pinning every badge-covered attribute to a real table weight. The badge still covers only three ATA attributes and still diverges from the detail score; that remains out of scope. - **openapi `value` wording** now says direction comes from the attribute's `ideal` metadata, and `trend_bonus` documents the clamp. - **Unreachable fallback in `replacementRiskSeverity`** still returns `GetTransformedValue()`; a comment records why that stays consistent (devstat and FARM attributes set `TransformedValue` from their own value). - **Not fixed: both callers fetch the whole history to read two entries.** The suggested fix, passing the weighted attribute IDs to `GetSmartAttributeHistory`, would be a no-op: the `attributes` argument is accepted and never applied in `aggregateSmartAttributesQuery`. Narrowing the field set means changing the history query itself, which is a wire contract (invariant 7) and cannot be validated here. Pre-existing; the dead parameter is now documented at its declaration. ## Second review pass An independent Codex review of `488f55b3` returned two P2 findings. Both are reporting boundaries rather than miscalculations, and both are documented and pinned by tests in `98322c1a` rather than re-engineered. - **Per-attribute `trend_score` is not reconciled with the clamped `trend_bonus`.** True by construction: `clampRiskTotals` clamps the totals, contributions keep their own values. Redistributing the clamped bonus across rows would make every row misreport its own attribute, and would still leave the static half unreconciled, since the ATA table's maximum exceeds 100 by design. Documented in openapi and in the scorer, with `TestContributionsStayPreClampWhileTotalsCarryTheCeiling` pinning the relationship. - **The window cutoff resolves to a day, not an instant.** History rows are daily aggregates timestamped at the end of their UTC day (`duplicate(column: "_stop", as: "_time")`), so a sample taken hours before the cutoff is kept when its day ends after it. Worst case a 90-day window reaches into day 91, against the full year it reached before this branch. Tightening it means filtering inside the history query, which is a wire contract shared with every history caller (invariant 7) and is not verifiable without a live InfluxDB. Documented on the helper and on the `trend_window` parameter. The review also named test gaps, now covered: reported values on the NVMe and SCSI paths, and 187 scoring from its raw counter while 188 stays on status. One gap is left open: no test catches reverting only one of the two production callers of `oldestAttributesFromHistory`, which needs a handler-level test with a mocked repository that the notification path does not currently have. ## Additional Notes Behaviour change operators will see: ATA scores rise for drives with signals on the newly weighted attributes or with a worsening counter trend, and replacement-risk notifications can now fire on drives where the trend bonus previously could not accumulate. The notification default threshold is still `replace_soon` (score 76+). Out of scope, noted while reading: `database/summary_risk.go` computes the dashboard badge from a separate simplified scorer covering three ATA attributes. It was already inconsistent with the detail endpoint and this PR widens that gap; worth its own issue. Review: not required (no deploy on merge, no security or access boundary, reversible, no cross-repository contract).
ATA observed-threshold buckets are annual failure rates measured over a mixed-drive population, not an ordinal severity scale. Scoring the single bucket a value landed in let a worse value earn a milder status than a better one, and left a value past the last bucket unscored. Score the worst failure rate observed by the time an attribute has degraded to its current value, in the direction its Ideal declares. Bucket edges are unchanged, so no value moves to a different bucket. Attribute 4 now declares Ideal: low. Attributes 3, 184 and 195 lose their buckets, which were derived from vendor-scaled normalized values, and fall back to the manufacturer threshold. Fixes #1078
## Summary Removes the observed-threshold gate on residual replacement-risk weights. Its premise was removed by #1088, and keeping it fails a test on `develop` and suppresses real failure signals. ## Type of Change - [x] Bug fix (non-breaking change that fixes an issue) - [ ] New feature (non-breaking change that adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update - [ ] Refactoring (no functional changes) - [ ] CI/CD or infrastructure change ## Related Issues Fixes #1091 Follows #1089, interacts with #1088 ## Changes Made #1089 added a residual weight for every attribute `AtaMetadata` marks critical that the curated table omits, gated on the attribute carrying `ObservedThresholds`. The gate had one justification: `ValidateThreshold` warned on any critical attribute whose value matched no bucket, so an attribute with no buckets at all was WARN on every drive that reported it, and weighting that warning would have charged healthy drives for a metadata gap. #1088 merged immediately after and replaced that fallback with an early return, so a bucketless attribute now takes no status from observed thresholds at all. It also removed the buckets from attributes 3, 184 and 195. Combined on `develop`, two things are wrong: - Attribute 184 lost its buckets, so the gate drops it from `AtaReplacementRiskWeights`, while `TestComputeRiskContributionsReportsChartedValueForStatusScoredAttributes` from #1089 still asserts 184 is weighted. The suite fails on `develop`. CI triggers on `pull_request` only, so neither merge was tested against the other. - With the false warning gone, the gate only suppressed real signals. A manufacturer `FAILING_NOW` on attribute 184 or 201, or an operator override, scored nothing — the exact coverage gap #1089 set out to close. So: gate removed. Every critical attribute carries a weight again, and the ATA table returns to a theoretical maximum of 109 (curated 100 plus three residuals of 3), which the scorer already clamps to 100. Verified against the deployed `develop` image, revision `2dadf5de`, on the Zeus test instance: before this change the contributions list for an ATA device carries the residual for 177 and no row for 184. ## Testing - [ ] I have tested this locally - [x] I have added/updated tests that prove my fix/feature works - [ ] All existing tests pass Not run locally by request; CI `Test Backend` and `Lint Backend (Go)` are the validation of record. - `TestValidateThreshold_CriticalWithoutObservedThresholds_StaysPassed` (measurements) pins the property that makes the residual weight safe: a critical attribute with no buckets keeps a passed status, no failure rate, no status reason. If #1088's early return were ever reverted while these attributes carry weight, every drive reporting attribute 201 would both warn and gain risk points, and this goes red first. - `TestAtaReplacementRiskWeightsCoverCriticalAttributesWithoutObservedThresholds` replaces the test that asserted the exclusion, and fails if the gate returns. - `TestAtaReplacementRiskWeightsCoverEveryCriticalAttribute` drops its observed-threshold qualifier and now covers all ten critical attributes. - The #1089 test asserting attribute 184 is weighted passes again, which is the `develop` breakage this PR clears. ## Checklist - [x] My code follows the project's code style - [x] I have performed a self-review of my code - [x] I have commented my code where necessary (particularly complex areas) - [x] I have updated the documentation if needed - [x] My changes generate no new warnings - [x] No console.log, debug statements, or commented-out code Invariant 26 in `docs/agents/invariants.md` is amended to match (every critical attribute weighted, including bucketless ones, with the reason). That file is gitignored, so the edit is local to the maintainer checkout and cannot appear in this diff. ## Additional Notes Scoring impact is small and in one direction: attributes 184 and 201 can now contribute 3 points each, and only when something real sets their status, since observed thresholds no longer touch them. No curated weight changes. Worth a separate look, out of scope here: CI runs on `pull_request` only, so two individually-green PRs can land a broken `develop` with nothing reporting it. A push trigger on `develop` would have caught this within minutes of the second merge. Review: not required (no deploy on merge, no security or access boundary, reversible, no cross-repository contract).
… the day view (#1087) In the dashboard temperature chart's day view, a drive sampled less often than its neighbours was drawn as isolated points instead of a line, and the shared tooltip showed no value for it. Day view is the only range returning raw points, so a SATA drive reporting an SCT temperature history table set the shared snap tolerance from its own minute cadence and every reading of a sparser series was padded with null. Interpolate those padded slots per series, bounded by 1.5 of that series' own median sampling interval so one missed collector run stays a gap at every cadence, and only for a series holding at least two intervals. Mark an interpolated value with a leading tilde so it is not read as a measurement, and where a series has no value at all, report its nearest real reading with the time it was taken instead of a bare dash. Real outages stay visible as gaps in the line. Also run CI on every push to develop. It triggered on pull_request alone, so the post-merge state of develop was never tested and two individually green pull requests could break it, which is how the Go suite was left red by #1088 and #1089. Related to #1076.
… 192 (#1094) Start/Stop Count and Power-off Retract Count are usage counters, not error counters. Both rise with uptime and power management, so their observed-threshold buckets measured fleet age rather than damage: attribute 4's 52-65 bucket read 19.4% while 91-104 read 0%, and attribute 192 at 1600 retracts sat in a 0.52% bucket beneath an 11.97% one. Those inversions were invisible while each value was scored against its own bucket. After #1088 made severity monotonic the worst early bucket carried upward, so every spinning drive scored the same rate with no return to passing. On a 14 drive host, devices flagged on one of the two went from 4 to 12 at unchanged raw values, each reporting an identical rate regardless of its count. Both attributes now fall back to the manufacturer threshold, as attributes 3, 184 and 195 do since #1088. Raw values and the manufacturer verdict stay visible, and a consumer drive profile can still supply buckets for the models it covers. This resolves the effect reported in #1078: healthy WD Ultrastar DC HC550 drives warned permanently on Start/Stop Count 69, producing a notification every collector run. Fixes #1093
## Summary Weights the three non-critical ATA attributes that can take a WARN or FAILED status but carry no replacement-risk weight, so an amber attribute on the detail page can no longer be absent from the Replacement Risk table. ## Type of Change - [x] Bug fix (non-breaking change that fixes an issue) - [ ] New feature (non-breaking change that adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update - [ ] Refactoring (no functional changes) - [ ] CI/CD or infrastructure change ## Related Issues Fixes #1095 Completes the second half of #1084, after #1089 and #1092 covered critical attributes ## Changes Made `ValidateThreshold` can mark any attribute carrying observed thresholds as WARN (annual failure rate above 10%) or FAILED (above 20%). Three non-critical attributes carry thresholds and no weight: **11** Recalibration Retries, **183** SATA Downshift Error Count, **189** High Fly Writes. Each can show a status the Replacement Risk table cannot explain and the score does not reflect. - Residual weights are now derived for every attribute the curated table omits that Scrutiny can act on, rather than for critical attributes alone. The rule becomes "weighted if it can take a status". - `AtaObservedThresholdResidualWeight` is **2**, against `AtaCriticalResidualWeight` **3**. Non-critical cutoffs are looser, warning at the failure rate where a critical attribute already fails, so the evidence is weaker and the weight should be too. The list was five attributes until #1094 removed the observed-threshold buckets from usage counters 4 and 192 — the two cases actually visible on hardware (several Zeus drives carried a status on them with no table row). That fix addressed those two at the metadata end. This one makes the scoring side general, so the next bucketed non-critical attribute does not land in the same state. Effective ATA maximum goes from 109 to 115 (curated 100, three critical residuals at 3, three non-critical residuals at 2). The scorer already clamps the score and the reported trend bonus to 100. ## Testing - [ ] I have tested this locally - [x] I have added/updated tests that prove my fix/feature works - [ ] All existing tests pass Not run locally by request; CI `Test Backend` and `Lint Backend (Go)` are the validation of record. - `TestAtaReplacementRiskWeightsCoverEveryAttributeScrutinyCanActOn` fails for any attribute that is critical or carries observed thresholds and has no weight. It replaces the critical-only coverage assertion and is what catches the next addition. - `TestAtaResidualWeightsRankCriticalAboveNonCritical` pins each residual to the right constant and refuses to pass vacuously if the residual set is ever empty. - `TestComputeRiskContributionsSurfacesWarnedNonCriticalAttributes` drives the real path: attribute 189 at WARN with raw 37 reports value 37 and score 1.0, which is warn severity 0.5 against weight 2. ## Checklist - [x] My code follows the project's code style - [x] I have performed a self-review of my code - [x] I have commented my code where necessary (particularly complex areas) - [x] I have updated the documentation if needed - [x] My changes generate no new warnings - [x] No console.log, debug statements, or commented-out code Invariant 26 in `docs/agents/invariants.md` is amended to describe both residual weights. That file is gitignored, so the edit is local to the maintainer checkout and cannot appear in this diff. ## Additional Notes Scoring impact is small and bounded: 1 point for a warned non-critical attribute, 2 for a failed one. No curated weight changes, and none of the three currently carries a status on any drive in the Zeus fleet, so no existing score moves there. Review: not required (no deploy on merge, no security or access boundary, reversible, no cross-repository contract).
## Summary Move the darwin and freebsd cross-compiles off `macos-latest` and onto `ubuntu-latest` in both the CI and release build matrices. Only one GitHub-hosted macOS runner is available at a time, so two of the three macOS jobs queue and are cancelled at a 15-minute wall, which fails the whole run even though every test and lint job is green. ## Type of Change - [x] CI/CD or infrastructure change ## Related Issues Fixes #1097 Unblocks #1085 and #1086, whose runs failed only on these jobs. ## Changes Made - `.github/workflows/ci.yaml:173-175`: `darwin/amd64`, `darwin/arm64` and `freebsd/amd64` now build on `ubuntu-latest`. - `.github/workflows/release.yaml:182-184`: the same three entries, so a release cannot publish without its darwin and freebsd binaries when a macOS runner is unavailable. ## Testing - [ ] I have tested this locally - [ ] I have added/updated tests that prove my fix/feature works - [x] All existing tests pass This PR validates itself: its own CI run executes the changed matrix, so the three moved jobs either build on Ubuntu here or they do not. Reasoning for why no macOS host is needed, which is what the change rests on: - Both workflows set `STATIC: true` (`ci.yaml:164`, `release.yaml:172`), and the Makefile turns that into `CGO_ENABLED = 0` plus `-tags "static netgo"` (`Makefile:28-31`). `make binary-all` is then a pure Go cross-compile selected by `GOOS` and `GOARCH`. - `make package-collector-omnibus` runs `GOOS= GOARCH= GOARM= go run ./build/package-collector-omnibus --target-os ... --target-arch ...`, building the packager for the host and passing the target as flags. - Nothing in either job runs a test or a tool on the target platform; both only cross-compile and upload artifacts. Evidence for the failure, from the runs on #1085 and #1086: - `41835858037` rerun: `Build darwin/amd64` succeeded in 63 seconds, while `Build darwin/arm64` and `Build freebsd/amd64` both started at 18:42:54 UTC and were cancelled at 18:57:55, the same second, exactly 15m00s later. No logs exist for the cancelled jobs. - `41835856980` rerun: all three cancelled, `darwin/amd64` at 16m06s. - `develop` CI at 13:49 UTC the same day was fully green, so this affects runs needing more than one macOS runner at once. ## Checklist - [x] My code follows the project's code style - [x] I have performed a self-review of my code - [x] I have commented my code where necessary (particularly complex areas) - [x] I have updated the documentation if needed - [x] My changes generate no new warnings - [x] No console.log, debug statements, or commented-out code ## Additional Notes The `ci.yaml` artifact names embed `matrix.cfg.on` (`ci.yaml:193`), so they change from `binaries-macos-latest-darwin-arm64` to `binaries-ubuntu-latest-darwin-arm64`. Nothing consumes them; `release.yaml` names and downloads its own artifacts (`release.yaml:213,234`). A narrower alternative is `max-parallel` on the macOS entries, which would serialise them rather than move them. That keeps the ten times macOS minute rate and still leaves the jobs queueing, so it treats the symptom. Review: required (alters the release build matrix, which decides which platform binaries a published release contains)
…cations (#1086) ## Summary With "Repeat Notifications: Only when the value has changed", `hasQualifyingFailure()` compared `GetTransformedValue()`, which is 0 for most ATA attributes (all except IDs 9, 188, 194) and for every NVMe attribute. Previous 0 == current 0, so no notification was sent, even for a passed -> failed transition. How it happens: a drive's attribute 5 goes from 0 to 8 reallocated sectors between two polls with "Only when the value has changed" set; the stored transformed value stays 0, so nothing is sent. ## Type of Change - [x] Bug fix (non-breaking change that fixes an issue) ## Related Issues Fixes #1077 The same bug was fixed upstream in AnalogJ#1094 (commit a2cbd4d), which introduced `GetComparableValue()`. This fork's status evaluation picks a different field per ATA attribute, so the comparison follows that instead. ## Changes Made - `measurements/smart.go`: new `AttributeEvaluatedValue()`, mirroring what status evaluation compares: ATA by the attribute's `DisplayType` in `AtaMetadata` (normalized, transformed or raw), and `Value` for NVMe, SCSI, FARM and device statistics. `AttributeThresholdValue()` is left alone; it is the value overrides pin. - `notify.go`: compare `AttributeEvaluatedValue()` (falls back to `GetTransformedValue()` for unknown types). Also notify when the current status has a required bit the previous submission lacked, compared on the masked bits (for example passed -> failed, or warning -> warning+failure at warn level). - Tests: ATA 5 raw 0 -> 8, failing value changed / unchanged, status changed with the value unchanged, extra warning bit is not a change, warn level warning -> failure with the value unchanged, attribute 195 (normalized) raw churn is not a change and normalized change is, attribute 194 min/max churn is not a change, NVMe `media_errors` changed / unchanged. ## Scope `reports/generator.go` and `get_device_replacement_risk.go` also read `GetTransformedValue()` for display; left out, they do not affect notifications. ## Testing - [x] I have tested this locally - [x] I have added/updated tests that prove my fix/feature works - [x] All existing tests pass `go vet` and `go test ./webapp/backend/pkg/notify/ ./webapp/backend/pkg/models/measurements/` (run with the `TestShouldNotify` tests plus the measurements tests). `go test ./webapp/backend/pkg/notify/ -run TestShouldNotify` passes (27 tests). Against the previous commit, the 195 and 194 churn tests, the normalized-change test and the warning-bit test fail; they pass now. The status-only test fails if the status check is removed, and `TestShouldNotify_NoRepeat_AtaWarnLevelWarningEscalatesToFailure` fails with the old any-bit status check. Not run: the full notify package (`TestScriptStreamsOutputAndPreservesEnvironment` times out on my machine with or without this change). ## Checklist - [x] My code follows the project's code style - [x] I have performed a self-review of my code - [x] I have commented my code where necessary (particularly complex areas) - [x] I have updated the documentation if needed - [x] My changes generate no new warnings - [x] No console.log, debug statements, or commented-out code --------- Signed-off-by: Ryo Kusnadi <ryokusnadi@gmail.com> Co-authored-by: Eder <34795193+Starosdev@users.noreply.github.com>
…#1085) ## Summary Scheduled report warning/failure lines showed an empty attribute name, a value of 0 and no threshold, e.g. `Attribute 3 () = 0`. `populateAlerts` never set `AttributeName` or `Threshold`, and used `GetTransformedValue()`, which is 0 for most attributes. ## Type of Change - [x] Bug fix (non-breaking change that fixes an issue) ## Related Issues Fixes #1079 ## Changes Made - Add `alertAttributeDetails` in `reports/generator.go`, which follows the detail page (`detail.component.ts`): - ATA: name from the metadata display name (smartctl `Name` only if there is no metadata, then the attribute ID); value from `ThresholdValue` (normalized, transformed or raw, so temperature shows 40 instead of the packed raw bytes); the drive threshold is shown only for normalized attributes or attributes without metadata. - Device statistics and FARM: metadata threshold first, drive-reported threshold as fallback (same as their status checks). - NVMe and SCSI: `Value`, drive threshold, metadata display name. Their "no threshold" marker `-1` is reported as `0`, so the text, HTML and PDF reports all show no threshold instead of `-1`. - Add an exported `SmartAtaAttribute.ThresholdValue` that calls the existing `thresholdValue`, so the report reuses it instead of a third copy of the switch. `thresholdValue` stays, since #1086 uses it. - Add tests: the report-level test, plus a table test for transformed ATA, raw ATA with a threshold, ATA without metadata or name, devstat and FARM metadata thresholds, the `-1` marker, and SCSI. ## Testing - [x] I have tested this locally - [x] I have added/updated tests that prove my fix/feature works - [x] All existing tests pass `go test ./webapp/backend/pkg/reports/... ./webapp/backend/pkg/models/measurements/...` passes. Before the change the new cases fail (for example attribute 194 printed 65576 instead of 40, attribute 10 printed a threshold of 97 next to a raw value of 2). Not run: the full suite or a live scheduled report. ## Checklist - [x] My code follows the project's code style - [x] I have performed a self-review of my code - [x] I have commented my code where necessary (particularly complex areas) - [x] I have updated the documentation if needed - [x] My changes generate no new warnings - [x] No console.log, debug statements, or commented-out code --------- Signed-off-by: Ryo Kusnadi <ryokusnadi@gmail.com> Co-authored-by: Eder <34795193+Starosdev@users.noreply.github.com>
fix(release): notify on new failures again, score ATA thresholds by worsening direction, and complete replacement-risk coverage
## [1.79.1](v1.79.0...v1.79.1) (2026-11-04)
…il, add rebuild_tag input (#1101) ## Summary The v1.79.1 release run (https://github.com/Starosdev/scrutiny/actions/runs/41919956636) tagged and published the release, then failed in `Generate release notes from PRs` on a GitHub API `i/o timeout`. Because the `Semantic Release` job failed, `Build Binaries` and `Upload Release Assets` were skipped: v1.79.1 has 2 assets where v1.79.0 has 82, and nothing could rebuild them for an existing tag. This keeps the binary build and asset upload running when notes fail, and adds a `rebuild_tag` dispatch input so a release left without binaries can be repaired without tagging a new version. ## Type of Change - [x] Bug fix (non-breaking change that fixes an issue) - [x] CI/CD or infrastructure change ## Related Issues Fixes #1100 ## Changes Made - `.github/workflows/release.yaml`: `Generate release notes from PRs` is `continue-on-error: true`. The tag and release already exist at that point; notes are repairable afterwards with `generate-release-notes.sh` and `gh release edit`, assets are not. The step still fails visibly with an `::error` annotation and `Update release notes` keeps the semantic-release default when no notes file exists. - `.github/workflows/release.yaml`: new `workflow_dispatch` input `rebuild_tag`. When set, a `Reuse existing release tag` step verifies the release with `gh release view`, exports `new_release_published=true` and the version, and the forced release commit, `Semantic Release` and the notes steps are skipped. Job outputs fall through `steps.rebuild || steps.semantic`, so `Build Binaries` and `Upload Release Assets` run for that tag with `--clobber`. - `docs/DEPLOYMENTS.md`: replaces the "workflow fails for manual repair" bullet and documents the rebuild path. - `scripts/tests/test_release_workflow.py`: pins `continue-on-error` on the notes step, the `rebuild_tag` input, the step gates and the output fallthrough. ## Testing - [x] I have tested this locally - [x] I have added/updated tests that prove my fix/feature works - [x] All existing tests pass `actionlint .github/workflows/release.yaml` is clean. Both new tests pass against this branch and fail against `origin/develop` (`KeyError: 'continue-on-error'` and the `rebuild_tag` assertion). Not run: the rebuild path end to end, which needs the workflow on `master`; the first use will be `rebuild_tag=v1.79.1` after the next promotion, which also proves it. Review: not required (CI change; takes effect only through the manual Release workflow after promotion). ## Checklist - [x] My code follows the project's code style - [x] I have performed a self-review of my code - [x] I have commented my code where necessary (particularly complex areas) - [x] I have updated the documentation if needed - [x] My changes generate no new warnings - [x] No console.log, debug statements, or commented-out code
fix(release): publish binaries even when release notes fail, and rebuild assets for an existing tag
## [1.79.2](v1.79.1...v1.79.2) (2026-11-04)
…nerator (#1107) ## Summary Count non-failed devices that have at least one `ActiveFailures` entry with `Status == "warning"` in `report.WarningDevices` instead of unconditionally classifying all non-failed devices into `report.PassedDevices`. ## Type of Change - [x] Bug fix (non-breaking change that fixes an issue) - [ ] New feature (non-breaking change that adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update - [ ] Refactoring (no functional changes) - [ ] CI/CD or infrastructure change ## Related Issues Fixes #1105 ## Changes Made - Updated `Generator.Generate` in `webapp/backend/pkg/reports/generator.go` to check `deviceReport.ActiveFailures` (populated by `populateAlerts()`) for `Status == "warning"` and increment `report.WarningDevices++` for non-failed devices carrying attribute-level warnings. - Removed the dead `report.TotalDevices - report.PassedDevices - report.FailedDevices` assignment that previously evaluated to `0` because warnings exist at the SMART attribute level rather than `DeviceStatus`. - Added `TestGenerateReport_CountsWarningDevicesFromActiveFailures` in `webapp/backend/pkg/reports/generator_test.go` covering passed, attribute-warning, and failed devices (`HasWarnings() == true`). ## Testing - [x] I have tested this locally - [x] I have added/updated tests that prove my fix/feature works - [x] All existing tests pass ## Checklist - [x] My code follows the project's code style - [x] I have performed a self-review of my code - [x] I have commented my code where necessary (particularly complex areas) - [x] I have updated the documentation if needed - [x] My changes generate no new warnings - [x] No console.log, debug statements, or commented-out code Signed-off-by: duongynhi000005-oss <duongynhi000005@gmail.com> Signed-off-by: duongynhi000005-oss <duongynhi000005@gmail.com>
1 of 4 tasks
Owner
|
Superseded by #1114, which carries the conflict resolution on its own branch (this PR's head is |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Automated branch sync could not fast-forward
betabecause master andbetahave conflicting changes.Resolve the conflicts and merge this PR to keep
betain sync withmaster.Note: opened by GITHUB_TOKEN, so CI does not run automatically. Verify locally before merging.