LLVM/project f5eb3a4clang/include/clang/Basic DiagnosticSemaKinds.td

[clang][diagnostics] Remove incorrect spaces before punctuation (#217212)

This isn't french.
DeltaFile
+2-2clang/include/clang/Basic/DiagnosticSemaKinds.td
+2-21 files

LLVM/project 2db4f35mlir/lib/Dialect/LLVMIR/IR LLVMAttrs.cpp LLVMDialect.cpp, mlir/test/Dialect/LLVMIR roundtrip.mlir invalid.mlir

fix: allow generic profile function metadata
DeltaFile
+30-2mlir/test/Dialect/LLVMIR/invalid.mlir
+16-0mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp
+11-0mlir/test/Dialect/LLVMIR/roundtrip.mlir
+3-1mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp
+60-34 files

LLVM/project 6f68a64mlir/include/mlir/Dialect/LLVMIR LLVMOps.td LLVMAttrDefs.td, mlir/lib/Dialect/LLVMIR/IR LLVMAttrs.cpp

[MLIR][LLVM] Add function metadata to LLVMFuncOp

Add a generic LLVM dialect carrier for LLVM IR function metadata on LLVMFuncOp.
Represent attachments as an ordered list so repeated metadata kinds, such as
multiple type metadata attachments, can be preserved while keeping metadata names
language-agnostic.
DeltaFile
+22-0mlir/test/Dialect/LLVMIR/roundtrip.mlir
+22-0mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
+20-0mlir/test/Dialect/LLVMIR/invalid.mlir
+18-0mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp
+3-0mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
+1-0mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+86-06 files

FreeBSD/ports 86c227dnet/rclone Makefile distinfo

net/rclone: Update 1.74.4 => 1.75.0

Changelog:
https://rclone.org/changelog/#v1-75-0-2026-07-31

PR:             297457
Security:       GHSA-6jcg-q3wp-x2f4
Security:       GHSA-8c48-q9wj-3w37
Security:       GHSA-xhf4-832v-7xcr
Security:       GHSA-7p4m-qxvv-g567
Security:       GHSA-mfvx-7rcj-9m5g
Security:       GHSA-gwfq-86j8-7qhv
Security:       GHSA-8mxv-9xhp-86h4
Security:       GHSA-45pq-889g-fcgh
Security:       GHSA-2m8m-jhrm-w6j2
Security:       GHSA-h4mf-4v27-hggj
Security:       GHSA-3x6r-wxxg-53vv
Sponsored by:   UNIS Labs
MFH:            2026Q3
DeltaFile
+5-5net/rclone/distinfo
+1-2net/rclone/Makefile
+6-72 files

FreeBSD/ports e523279sysutils/rustic pkg-plist Makefile

sysutils/rustic: Update to 0.11.4

ChangeLog:      https://github.com/rustic-rs/rustic/releases/tag/v0.11.4
Reported by:    "github-actions[bot]" <notifications at github.com>
DeltaFile
+601-529sysutils/rustic/distinfo
+299-263sysutils/rustic/Makefile.crates
+2-2sysutils/rustic/Makefile
+1-0sysutils/rustic/pkg-plist
+903-7944 files

LLVM/project 7002c4fmlir/lib/Transforms/Utils WalkPatternRewriteDriver.cpp, mlir/test/Conversion/SCFToOpenMP vector-reduction.mlir

[MLIR] Fix ErasedOpsListener false positives for newly created ops/blocks (#192291)

WalkPatternRewriteDriver's ErasedOpsListener incorrectly flagged
erasures of ops/blocks that were created during the current pattern
application. Since those ops were never in the walk schedule, erasing
them is safe.

Track newly inserted ops and blocks per visited op; skip the erasure
check for them. Also fix the TestPatterns CloneRegionBeforeOp pattern
to wrap op->setAttr() in modifyOpInPlace so the rewriter observes the change.

Add a focused walk-driver regression that creates and erases an
operation and a block during one pattern application, and checks that
listener notifications are still forwarded.

Fix some failures present with
MLIR_ENABLE_EXPENSIVE_PATTERN_API_CHECKS=ON.

Assisted-by: Codex

Co-authored-by: Claude Sonnet 4.6 <noreply at anthropic.com>
DeltaFile
+31-3mlir/test/lib/Dialect/Test/TestPatterns.cpp
+30-2mlir/lib/Transforms/Utils/WalkPatternRewriteDriver.cpp
+13-1mlir/test/IR/test-walk-pattern-rewrite-driver.mlir
+0-2mlir/test/Transforms/test-strict-pattern-driver.mlir
+0-2mlir/test/Dialect/Linalg/drop-unit-extent-dims.mlir
+0-2mlir/test/Conversion/SCFToOpenMP/vector-reduction.mlir
+74-122 files not shown
+74-168 files

LLVM/project fb0a50ellvm/include/llvm/CodeGen TargetLowering.h BasicTTIImpl.h, llvm/lib/Target/AArch64 AArch64ISelLowering.cpp

[TLI] Remove shouldExpandCttzElements. NFC (#217208)

SelectionDAGBuilder no longer uses it to query if it needs expanded now
that we have dedicated ISD::CTTZ_ELTS[_ZERO_POISON] nodes that can be
expanded during DAG legalization. It's only used for target specific
costing which can just be inlined.

We have to use isOperationCustom on AArch64 since
isOperationLegalOrCustom also checks if the type is legal, which isn't
the case for fixed predicate vectors.
DeltaFile
+0-11llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+2-7llvm/include/llvm/CodeGen/BasicTTIImpl.h
+0-4llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+0-4llvm/include/llvm/CodeGen/TargetLowering.h
+0-2llvm/lib/Target/RISCV/RISCVISelLowering.h
+1-1llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
+3-292 files not shown
+4-318 files

NetBSD/pkgsrc BBdcBLodoc CHANGES-2026

   Updated textproc/py-lxml, devel/py-cachelib
VersionDeltaFile
1.5402+3-1doc/CHANGES-2026
+3-11 files

FreeBSD/ports 488a8efsysutils Makefile, sysutils/helm-docs distinfo pkg-descr

sysutils/helm-docs: New port

A tool that auto-generates documentation from helm charts into markdown
files. The resulting files contain metadata about their respective chart
and a table with each of the chart's values, their defaults, and an
optional description parsed from comments.

PR:             297599
Approved by:    arrowd (co-mentor)

(cherry picked from commit 691c574c56c433a75ef54e2e0b39aa72b61e732f)
DeltaFile
+30-0sysutils/helm-docs/Makefile
+10-0sysutils/helm-docs/pkg-descr
+5-0sysutils/helm-docs/distinfo
+1-0sysutils/Makefile
+46-04 files

LLVM/project aa2c9afllvm/include/llvm/Target/GlobalISel Combine.td, llvm/lib/Target/AArch64 AArch64Combine.td

[GlobalISel] Combine G_SEXT_INREG(G_ZEXT) -> G_SEXT through unmerge (#216951)

This extends the code added in #213606 to look through an unmerge, as
can be found after type legalization on AArch64. It looks for
G_SEXT_INREG(G_ZEXT(G_UNMERGE(G_ZEXT))), converting it to
G_SEXT(G_UNMERGE(G_SEXT)). The apply code uses c++ as it needs to create
new temporary virtual registers.
DeltaFile
+99-0llvm/test/CodeGen/AArch64/GlobalISel/combine-sext-inreg.mir
+23-0llvm/include/llvm/Target/GlobalISel/Combine.td
+1-0llvm/lib/Target/AArch64/AArch64Combine.td
+123-03 files

FreeBSD/ports 691c574sysutils Makefile, sysutils/helm-docs distinfo pkg-descr

sysutils/helm-docs: New port

A tool that auto-generates documentation from helm charts into markdown
files. The resulting files contain metadata about their respective chart
and a table with each of the chart's values, their defaults, and an
optional description parsed from comments.

PR:             297599
Approved by:    arrowd (co-mentor)
DeltaFile
+30-0sysutils/helm-docs/Makefile
+10-0sysutils/helm-docs/pkg-descr
+5-0sysutils/helm-docs/distinfo
+1-0sysutils/Makefile
+46-04 files

NetBSD/pkgsrc-wip 5e22765llama.cpp Makefile.common PLIST

llama.cpp: update to 0.0.2.10488.
DeltaFile
+6-6llama.cpp/distinfo
+3-3llama.cpp/PLIST
+2-2llama.cpp/Makefile.common
+11-113 files

NetBSD/pkgsrc yplpIu7devel/py-cachelib Makefile distinfo

   py-cachelib: updated to 0.15.4

   Version 0.15.4

   - Fix dumps in ``RedisCache`` to not use pickle for integers,
     so they remain compatible with the native ``INCRBY``/ ``DECRBY``
     operations used by :meth:`inc`/:meth:`dec`. :pr:`496`


   Version 0.15.3

   - Fix ``MemcachedCache`` ``inc`` and ``dec`` methods double normalizing keys. :pr:`495`


   Version 0.15.2

   - Fix ``libmc`` in ``MemcachedCache`` no reserve nor blocking. :pr:`493`



    [13 lines not shown]
VersionDeltaFile
1.16+4-4devel/py-cachelib/distinfo
1.17+2-2devel/py-cachelib/Makefile
+6-62 files

NetBSD/pkgsrc-wip 3f63e3csweethome3d DESCR distinfo, sweethome3d/files PlatformPropsImpl.java

sweethome3d: Add sweethome3d-7.5

Sweet Home 3D is a free interior design application that helps you draw
the plan of your house and arrange furniture on it.
DeltaFile
+557-0sweethome3d/files/PlatformPropsImpl.java
+60-0sweethome3d/Makefile
+7-0sweethome3d/PLIST
+5-0sweethome3d/distinfo
+5-0sweethome3d/COMMIT_MSG
+3-0sweethome3d/DESCR
+637-06 files

FreeBSD/ports ef88181www/freenginx Makefile, www/nginx Makefile

www/{nginx,nginx-devel,freenginx}: 3rd-party modules management

Copy the module sources with cp instead of COPYTREE_SHARE in the
LUA and LUASTREAM pre-configure targets. COPYTREE_SHARE hardlinks
the files and then fails to chmod them when poudriere builds as an
unprivileged user.

Convert www/nginx-module-lua into a pure source-only port. The
prebuilt DSO conflicted with the module built by the nginx ports.

Add compat patches so lua-nginx-module builds against freenginx.

PR:             297651
Reported by:    Brad Ackerman
Sponsored by:   Netzkommune GmbH
DeltaFile
+10-39www/nginx-module-lua/Makefile
+16-0www/nginx-module-lua/files/patch-src_ngx__http__lua__subrequest.c
+14-0www/nginx-module-lua/files/patch-src_ngx__http__lua__time.c
+4-4www/nginx/Makefile
+4-4www/nginx-devel/Makefile
+4-4www/freenginx/Makefile
+52-512 files not shown
+53-588 files

NetBSD/pkgsrc e8mzMNJdoc CHANGES-2026

   doc: Updated math/ggml to 0.20.1
VersionDeltaFile
1.5401+2-1doc/CHANGES-2026
+2-11 files

NetBSD/pkgsrc x5j8JEymath/ggml Makefile distinfo

   ggml: update to 0.20.1.

   No changelog found.
VersionDeltaFile
1.9+4-4math/ggml/distinfo
1.9+2-2math/ggml/Makefile
+6-62 files

NetBSD/pkgsrc 1Qd7aXbtextproc/py-lxml Makefile distinfo

   py-lxml: updated to 6.1.2

   6.1.2 (2026-08-18)

   Bugs fixed

   * Some build files were missing in the sdist.
     Patch by Nicola Soranzo.

   * Some minor corrections for error handling cases.

   Other changes

   * Built with Cython 3.2.9.
VersionDeltaFile
1.87+4-4textproc/py-lxml/distinfo
1.132+2-2textproc/py-lxml/Makefile
+6-62 files

FreeNAS/freenas 76f4486src/middlewared/middlewared/alert/source license_status.py

Only report a missing license on HA capable systems

This commit fixes an issue where an unlicensed R-series or Z-series started getting told to contact support about a license it was never sold. Those chassis are appliances so they satisfy the hardware rule, but they cannot fail over, and on 26 the product_type disjunct meant a system with no license only reached this alert when it was HA capable. HA capability is a chassis probe the applicability axes deliberately do not carry, so the test sits in check_sync rather than in applies_to.
DeltaFile
+3-0src/middlewared/middlewared/alert/source/license_status.py
+3-01 files

FreeNAS/freenas 404d7e2src/middlewared/middlewared/alert/source security.py, src/middlewared/middlewared/pytest/unit/alert/golden applicability.txt

Run the local account expiration alert everywhere

This commit fixes an issue where the local account expiration alert stopped running on Minis even though they can still turn on password aging: max_password_age sits behind the STIG entitlement, whose vector grants on the key column of either hardware side, and that key is injected into every legacy licence. The source is also the admin lockout recovery, since it regenerates shadow a day before the last full admin password ages out, so excluding a system that can arm password aging leaves it with no way back in short of a reboot.

check() already returns early unless max_password_age is set, so that early return is the applicability test and the rule is dropped rather than widened. On a system that cannot set the option the daily cost is one config read.
DeltaFile
+1-2src/middlewared/middlewared/alert/source/security.py
+1-1src/middlewared/middlewared/pytest/unit/alert/golden/applicability.txt
+2-32 files

FreeNAS/freenas b38e8b5src/middlewared/middlewared/alert/source sata_dom_wear.py, src/middlewared/middlewared/pytest/unit/alert/golden applicability.txt

Remove the broken SATA DOM wear alert

This commit adds changes to delete the SATA DOM wear alert source and its two classes. The source calls disk.sata_dom_lifetime_left, which was removed in 25.10 and has no implementation anywhere, so it raises on every run on any M or Z series chassis and produces nothing but alert source failures.

Alerts already persisted on existing systems clear on the next start through the stale source check in initialize, which runs before the policies are built, so nothing is announced as cleared. No migration is needed, matching how every previous alert source removal was handled.
DeltaFile
+0-55src/middlewared/middlewared/alert/source/sata_dom_wear.py
+0-5src/middlewared/middlewared/pytest/unit/alert/golden/applicability.txt
+0-602 files

FreeNAS/freenas d9d3963src/middlewared/middlewared/alert base.py, src/middlewared/middlewared/alert/source jbof.py failover.py

Remove the product_type gate from alerts

This commit adds changes to delete `products` from every alert declaration now that the hardware and license axes carry the gating, along with the `product_types` field it fed in `alert.list_categories` and the unused `AlertService.product_type` helper. The applicability matrix loses its old-versus-new comparison and becomes a frozen inventory of what each declaration covers; the declared answers are unchanged from the previous commit, cell for cell.

The API field is removed outright rather than deprecated because nothing consumes it - it exists in no earlier API version and has no client in the WebUI, api_client or midcli, so the downgrade adapter's strip loop is already a no-op here. Forward-porting this to master will need a `to_previous` on `AlertCategoryClass`, because there v26_0_0 is frozen with the field required and the version adapter only backfills fields that are not required.
DeltaFile
+362-362src/middlewared/middlewared/pytest/unit/alert/golden/applicability.txt
+57-63src/middlewared/middlewared/pytest/unit/alert/test_applicability_matrix.py
+0-10src/middlewared/middlewared/alert/source/mseries_nvdimm_and_bios.py
+1-7src/middlewared/middlewared/alert/base.py
+0-7src/middlewared/middlewared/alert/source/failover.py
+0-6src/middlewared/middlewared/alert/source/jbof.py
+420-45520 files not shown
+422-52126 files

FreeNAS/freenas 0a67dd9src/middlewared/middlewared/alert/source failover_sync.py mseries_nvdimm_and_bios.py, src/middlewared/middlewared/plugins alert.py

Move alert gating onto hardware and license axes

This commit adds changes to give every declaration under alert/source its own applicability rule on the decoupled hardware and license axes, and points the enforcement sites in plugins/alert.py at those rules instead of system.product_type. The products lines stay for now because the API field still reads them. HA classes take a hardware applies_to alongside listed_when on purpose, so on iX hardware whose HA licence is absent or lapsed they leave the settings catalogue without being silenced, and a source that no longer applies now has its stored alerts dropped rather than stranding them undismissable. The two scheduled-reboot classes are the exception: they are gated on the HA licence itself, so a system without one stops seeing them at all.

sata_dom_wear is knowingly shipped in a broken state: its source calls disk.sata_dom_lifetime_left, which was removed in March 2025, so appliances will see the check fail. That is a deliberate, signed-off decision and not an oversight.

The checked-in matrix under pytest/unit/alert/golden spells out old versus new applicability per population for every declaration, and its test regenerates and diffs it so no population change lands unread.
DeltaFile
+377-0src/middlewared/middlewared/pytest/unit/alert/golden/applicability.txt
+266-0src/middlewared/middlewared/pytest/unit/alert/test_applicability_matrix.py
+34-16src/middlewared/middlewared/plugins/alert.py
+16-0src/middlewared/middlewared/alert/source/failover.py
+13-0src/middlewared/middlewared/alert/source/mseries_nvdimm_and_bios.py
+11-0src/middlewared/middlewared/alert/source/failover_sync.py
+717-1619 files not shown
+836-1625 files

FreeNAS/freenas e05ac86src/middlewared/middlewared/alert/applicability __init__.py engine.py, src/middlewared/middlewared/plugins alert.py

Name alert applicability rules and detect black-holed alerts

This commit adds changes to give the alert applicability engine one name per population instead of thirty open-coded rule constructions, and to catch alerts that are created but can never be displayed.

The rules alert declarations gate on now live in a vocabulary module next to the engine, so TRUENAS_HARDWARE is defined once rather than built at eighteen sites in two competing conventions. LicenseRule collapses into EntitlementRule, which asks the entitlement policy about any feature rather than the two the old enum could spell, so STIG and everything after it is a one-line declaration. AllOf joins AnyOf in the algebra, listed_when becomes listed_only_when to say that it narrows, and AlertFacts is gone in favour of the identical EntitlementFacts that applies() was converting to anyway.

A source whose rule is satisfied where its class's rule is not creates alerts that are stored and never shown. Nothing checked for that, and since the failover declarations deliberately straddle the two axes it is no longer something a reviewer can spot by eye. A test now infers the source to class relation out of check() and asserts the implication across every population, with a runtime guard logging the cases static analysis cannot see. It found four pre-existing ones in memory_errors and sensors, which are fixed by narrowing the sources so nothing user visible moves.

One behaviour change worth a release note: failover_related was gating enclosure_status on an HA licence, which is a licensing predicate in front of a hardware question, so unlicensed appliances will now report enclosure faults they were previously silent about. The flag is renamed post_failover_blackout to name what it actually contributes.
DeltaFile
+106-40src/middlewared/middlewared/pytest/unit/alert/test_applicability_matrix.py
+68-35src/middlewared/middlewared/alert/applicability/engine.py
+63-35src/middlewared/middlewared/plugins/alert.py
+89-0src/middlewared/middlewared/pytest/unit/alert/test_alert_black_holes.py
+48-29src/middlewared/middlewared/pytest/unit/alert/test_applicability_engine.py
+48-23src/middlewared/middlewared/alert/applicability/__init__.py
+422-16230 files not shown
+605-38936 files

FreeNAS/freenas 2f6040asrc/middlewared/middlewared/alert/source fips.py, src/middlewared/middlewared/pytest/unit/alert/golden applicability.txt

Keep the FIPS misconfiguration alert on licensed Minis and whiteboxes

This commit fixes an issue where the FIPS misconfiguration alert stopped running on licensed Minis and licensed whiteboxes even though those systems can still enable FIPS: the STIG vector is key-only on both hardware sides and STIG is injected into every legacy licence, so they are entitled while TRUENAS_HARDWARE excluded them by construction.

EXPECTED_TO_BE_LICENSED is a strict superset of both the old product_type gate and the hardware gate, so nothing loses coverage, unlicensed appliances keep the check that catches FIPS being active when it was never configured, and licensed whiteboxes that could never see this alert are now covered too.
DeltaFile
+2-2src/middlewared/middlewared/alert/source/fips.py
+1-1src/middlewared/middlewared/pytest/unit/alert/golden/applicability.txt
+3-32 files

FreeNAS/freenas 0ff57a1src/middlewared/middlewared/alert base.py, src/middlewared/middlewared/alert/applicability __init__.py snapshot.py

Type alert applicability against AlertSource and AlertClass

This commit adds changes to drop the Declaration protocols in favour of TYPE_CHECKING imports of AlertSource and AlertClass, which is what review asked for, and to tighten the surface while we are in there: rule_name is no longer re-exported now that declaration_rule_name is the only entry point production goes through, and the Rule docstring keeps just the part that constrains how you write one, which is to name it so the black-hole diagnostic has something to report.

Dropping the protocols makes alert.applicability depend on alert.base, and import-linter counts TYPE_CHECKING imports, so that broke the package layering contract: engine reached vocabulary and snapshot through alert.base importing the whole package. alert/base.py now takes Rule from the engine module directly, which is the only thing it ever wanted, and the contract holds without an ignore.
DeltaFile
+10-19src/middlewared/middlewared/alert/applicability/engine.py
+12-7src/middlewared/middlewared/alert/applicability/snapshot.py
+3-11src/middlewared/middlewared/alert/applicability/__init__.py
+2-2src/middlewared/middlewared/pytest/unit/alert/test_run_gates.py
+1-1src/middlewared/middlewared/pytest/unit/alert/test_applicability_engine.py
+1-1src/middlewared/middlewared/alert/base.py
+29-416 files

FreeNAS/freenas ce6fa0bdocs/source/middleware/plugins alert.rst

Document alert applicability and the frozen inventory

This commit adds changes to document the applicability axes and the frozen inventory in the alert plugin docs, since the only record of how to regenerate that file lived in the test module's own docstring and you only found it after CI had already failed. The populations are pulled in with automodule so a new one documents itself, and the page spells out what does and does not require a regeneration plus what each guard test means when it fails.
DeltaFile
+119-0docs/source/middleware/plugins/alert.rst
+119-01 files

FreeNAS/freenas 6d029f3src/middlewared/middlewared/pytest/unit/alert test_applicability_matrix.py test_alert_black_holes.py

Drive the alert enforcement sites from unit tests

This commit adds changes to test the four sites in plugins/alert.py that consume an applicability rule, rather than only the rules themselves. The run and send axes had no execution coverage at all: emptying the excluded-source set, deleting the alert purge loop, or making the send filter answer True all left the suite green. These drive __run_alerts and send_alerts against stub sources through a shared harness, and record what the policies delete, since dropping the purge loop still leaves the alert list correct and nothing else can see it.

The purge is worth pinning on its own because it destroys state: a source whose rule stops admitting this system loses the alerts it had persisted, and when it applies again they come back with a fresh uuid and their dismissed flag cleared. There is also an asymmetry three lines apart in that loop, deliberate but unasserted until now, where a rule-excluded source is purged and a gate-blocked one is only skipped.

Also fixes both AST scanners. BondStatus is a shipped source that does not carry the AlertSource name suffix, so the black hole check never saw it or the three classes it creates; keying off the subclass relation the loader itself uses picks it up and keeps the two modules from disagreeing. Reading attribute-spelled bases stops a class written as base.AlertClass dropping out of the frozen inventory with nothing to show for it. Both scanners now carry an invariant test, so a shape they cannot model fails instead of silently shrinking what is covered.
DeltaFile
+207-0src/middlewared/middlewared/pytest/unit/alert/harness.py
+163-0src/middlewared/middlewared/pytest/unit/alert/test_alert_send_alerts.py
+124-0src/middlewared/middlewared/pytest/unit/alert/test_alert_run_loop.py
+31-25src/middlewared/middlewared/pytest/unit/alert/test_alert_plugin_applicability.py
+41-4src/middlewared/middlewared/pytest/unit/alert/test_alert_black_holes.py
+36-3src/middlewared/middlewared/pytest/unit/alert/test_applicability_matrix.py
+602-322 files not shown
+615-468 files

FreeNAS/freenas 4270b33src/middlewared/middlewared/alert/applicability snapshot.py vocabulary.py, src/middlewared/middlewared/plugins alert.py

Express alert applicability rules as functions and cache them once

This commit adds changes to replace the applicability rule dataclasses with plain functions that take facts, and to route every applicability answer through a single Applicability object holding one reading of those facts and memoizing per declaration. Nothing in the tree ever introspected rule structure, so the isinstance dispatch and the AnyOf/AllOf combinators go away with it, and because the seven vocabulary names are unchanged no alert declaration moves and the golden matrix is byte for byte identical.

The five separate get_facts() reads in the alert plugin become one, invalidated on system.post_license_update so an upload takes effect on both nodes at once. A None license is never cached, since get_license() returns None both for "no license" and "the daemon did not answer" and we do not want a hiccup to stick until restart.
DeltaFile
+152-66src/middlewared/middlewared/pytest/unit/alert/test_applicability_engine.py
+191-0src/middlewared/middlewared/pytest/unit/alert/test_alert_plugin_applicability.py
+33-72src/middlewared/middlewared/alert/applicability/engine.py
+62-28src/middlewared/middlewared/plugins/alert.py
+43-28src/middlewared/middlewared/alert/applicability/vocabulary.py
+62-0src/middlewared/middlewared/alert/applicability/snapshot.py
+543-1945 files not shown
+615-23611 files

FreeNAS/freenas 8a61761src/middlewared/middlewared/alert/applicability __init__.py vocabulary.py, src/middlewared/middlewared/alert/source memory_errors.py

Keep uncorrected memory error alerts on Minis

This commit fixes an issue where the uncorrected memory error alert stopped running on Minis even though they carry ECC memory and populate the same EDAC counters the source reads. TRUENAS_HARDWARE excludes MINI by construction, so a licensed Mini lost a proactive support warning it used to get, and any alert it was already sitting on was purged on upgrade without a cleared notification.

TRUENAS_OR_MINI_HARDWARE is the union of the two hardware names, composed from them rather than defined as "not GENERIC" so a hardware class added later has to be added here deliberately. MemorySizeMismatch stays on TRUENAS_HARDWARE because its own check returns early without an HA licence.
DeltaFile
+9-0src/middlewared/middlewared/alert/applicability/vocabulary.py
+3-3src/middlewared/middlewared/pytest/unit/alert/golden/applicability.txt
+3-3src/middlewared/middlewared/alert/source/memory_errors.py
+2-0src/middlewared/middlewared/pytest/unit/alert/test_applicability_engine.py
+2-0src/middlewared/middlewared/alert/applicability/__init__.py
+19-65 files