Breeze RMM v0.117.0 — Hardware & RAID monitoring, the alert/monitor conversion completes, a native Gmail ticket connector, and the billing-profile cutover finishes (breaking column drop).
⚠️ Breaking change: the six legacy labour-pricing columns (ticket_categories.default_billable/default_hourly_rate/rate_currency, org_ticket_settings.default_billable/default_hourly_rate/rate_currency) are dropped from the database in this release. See Self-Hosting / Upgrade Notes before upgrading.
Summary
Hardware & RAID monitoring ships end-to-end (#6854): the agent collects controller/array/disk health from storcli, mdadm, Windows Storage Spaces, smartctl and in-band BMC sources, the API rolls it up with dedicated alerting, and the device Hardware tab shows arrays, physical disks, cache batteries and collection status — attach the four built-in hardware monitors to a configuration policy to receive failure alerts. This feature needs the agent update in this release (0.117.0); devices on older agents show no hardware data. The Alerts → Monitors conversion (W05c) is now fully in the web UI: a Needs-conversion panel walks every legacy alert policy through an equivalence preview, Convert everything for partner managers, and a persistent Undo. Business Reports gains its W03 UI (#3198): SLA attainment, technician time & billability, and AR aging report types are now generatable from the Reports gallery, including a partner-wide "All organizations" option for partner managers. A native Gmail/Google Workspace inbound mailbox connector joins the existing Microsoft 365 one for email-to-ticket (#6740). Cove backup-provider integration reaches a working sync (#6008 W02/W03): third-party backup jobs now appear alongside first-party ones in backup health views. And the billing-profile cutover that began in v0.115.0/v0.116.0 finishes: the six legacy labour-pricing columns are archived and dropped (#4628 W04b, #6335) — the boot-time interlock refuses to start if any partner was never converted. The release also carries a wide fix sweep from the post-v0.116.0 pre-release sweep, plus a handful of fail-closed hardening fixes in AI tools and audit reads.
Added
- Hardware & RAID monitoring (#6854): agent-side collection (
storcli/perccli/megacli/ssacli/arcconf/omreport/mdadm/zfs/Windows Storage Spaces/smartctl, plus in-band BMC), API rollup and ingest, four built-in hardware monitors (RAID health, disk health, cache battery, BMC), a device Hardware tab (arrays, physical disks, controller cache batteries, collection status), a device-list column/filter, and a Hardware Monitoring section on configuration policies (collection on by default — RAID every 10 min, disk health every 60 min; monitors are not attached to a policy by default). Requires the updated agent (0.117.0); older agents report no hardware data. - Business Reports W03 (#6813, feature #3198): the three W02 report types — SLA attainment, technician time & billability, and AR aging — are now generatable from the Reports gallery (Business group), as PDF or CSV, on demand or scheduled. A partner manager (
canManagePartnerWide) can generate a report across all organizations; other partner users must pick a single org. - Read-only report history for inactive organizations (#6771, #6850): an active partner can now read report definitions and past run metadata for its own suspended, churned, offboarding or archived orgs. Generating, scheduling, exporting or downloading stays refused.
- Cove backup-provider integration, W02/W03 (#6008): a working sync job maps vendor customers/devices to Breeze orgs/devices, persists a daily health ledger with two-poll alert hysteresis, and surfaces third-party backup jobs in the Integrations Backup tab, the Backup overview, and the device Backup tab alongside first-party backup coverage.
- Native Gmail / Google Workspace inbound mailbox connector (#6740): mirrors the existing Microsoft 365 email-to-ticket connector using the org's Google Workspace domain-wide delegation credential. Inbound only.
- Partner API — read-only alerts feed (#6847):
GET /api/v1/partner-api/alerts, behind a new opt-inalerts:readscope, lists alerts across every org a partner service principal can reach with lossless incremental sync. No acknowledge/resolve through this scope. - MCP: partner-wide scripts readable by org API keys, with a content pin (#6867): an org-scoped API key can now see its partner's partner-wide scripts through
run_script/get_script_details/list_scripts(read-only visibility, no new write access).get_script_detailsreturnscontentSha256;run_scriptaccepts an optionalexpectedContentSha256and refuses a mismatch before dispatch. - MCP: opt-in unattended Tier 3 execution (#6841):
MCP_UNATTENDED_TIER3_PRINCIPALSlets specific, explicitly-listed principals (api_key:<id>/oauth_client_user:<client_id>/<user id>) run Tier 3 MCP tools without interactive approval. Default is nobody; RBAC, the execute allowlist, and the Tier 3 execution ledger still apply. - System page (#6768): Settings → System now has a Connections tab (live status of configured integrations) and a Deprecations tab (what this version's deprecations/removals mean for this instance).
- Metric anomaly episodes W04 + org/partner toggle (#6650, #6538): device anomaly panels are now episode-based, resolve requests can record episode-level feedback, and the
ml.anomalies.enabledflag has a real Settings toggle at partner and org level (still off by default). - AI tools:
manage_ticket_checklist(#6930): checklists become AI-writable;replace_untickedis guarded against a checklist with a waiting Operator step. - AI budgets: per-tool rate-limit multiplier (#6476, #6852): Settings → AI Usage can raise (never lower) the effective per-minute rate limit for a specific AI/MCP tool.
- Configurable interactive AI approval timeout (#6475, #6829): 5–60 minutes, partner default with an org override.
- Billing: org-level payment-terms override (#6229): an org can now override the partner's default invoice payment-terms days; NULL inherits.
- Billing: partner identity falls back to company details (#6228): a partner whose Billing letterhead override (phone/website/address) is blank now has new invoices and quotes fill the gap from Settings → Company → Company details instead of rendering blank.
- Invoices: presentation frozen at issue (#6227): an invoice's theme and page size are now snapshotted the moment it's issued, instead of re-reading the partner's live settings on every render.
- Billing profiles W04a: work-type pickers on mobile + Outlook add-in (#4628): the mobile ticket timer and the Outlook time widget can pick a work type; the Billables CSV export gains
work_typeandincluded_minutestrailing columns. - Devices: installed helper (Breeze Assist) version is persisted and shown (#6751), and Devices now opens on the Agent segment, remembering the last choice (#5874).
- Network devices can change site, with a real (non-no-op) profile site-change action (#6766).
- Customer Portal Network Visibility, PR 2/3 of #5861 — per-asset network visibility endpoint and asset-level alert/ticket enrichment (active alert count, highest severity, open ticket count), behind an independent, fail-closed flag.
- Scripts can raise alerts from per-script exit-code severity mapping (#6690).
- Org bulk import gets a sample CSV and an import-guide link (#6051).
- Settings catalogue (#6220, #6994):
/settingsis now a full, searchable catalogue of every settings screen, grouped by area; the sidebar Settings menu is trimmed to the most-used entries plus a new More settings link. One shared gate predicate drives both, so they can't disagree on what a role can see. - Mobile: navigate and defer across pending approvals (#6212, #6996): the approval takeover screen gets Prev/Next paging ("2 of 5") and a "Later" defer action when more than one approval is pending.
- Custom fields are now selectable in the fleet-wide advanced device filter and as an opt-in device-list column (#6594, #6990) — previously only visible on the per-device detail page.
- Quotes: editable per-quote footer line (#6648, #6970), separate from Terms & Conditions, blank = inherit the partner/brand kit footer.
- Redis memory telemetry (#6452, #6968):
used_memory/maxmemory/usage-ratio are now on/metrics, with a throttled warning once usage crosses 80% (tunable) — the first operator signal used to be a failed login or a stuck queue. - AI: large-tool-result capture decoupled from the hosted AI-workspace flag (#6732, #7014): self-hosters can now opt into paging back oversized tool results (
read_artifact) viaBREEZE_AI_ARTIFACT_CAPTURE_ENABLEDwithout needing the hosted-only workspace lane — requires an artifact blob store to be configured; off by default.
Improved
- Winget updates with no applicable upgrade, and superseded WUA updates, are now skipped rather than reported as failed (#6910).
- Patch policy run-now jobs are enqueued only after the policy write commits, closing a race where a job could fan out against a not-yet-committed policy (#6632).
- Quote emails use the proposal title and customer name with warmer default copy (#6814).
- Webhook enable/disable toggle works reliably and legacy headers survive an edit (#6767).
- Configuration Policies → Monitors: attach/detach now preserves a monitor's inheritance link (#6842).
- Agent monitoring watches are cleared when no policy applies to a device, instead of lingering (#2949).
- Backup verify / test-restore downloads are bounded and preserve partial counts on very large S3-compatible snapshots (tens of thousands of objects), instead of silently reporting
0 files ok 0 files failedafter a 2-hour timeout (#6598). - The backup GC bucket listing is now streamed instead of materializing the whole bucket in memory — root cause of a September production OOM (#6834); a follow-up bounds three more GC memory/cost paths (reconcile full listing, local walk, unlimited-cap sweep) (#6843, #6984).
- Failed agent latest-version lookups now use a short TTL (10s) instead of caching the failure (#6629).
POST /mssql/restoreandPOST /hyperv/restorenow dispatch asynchronously instead of blocking the request for up to 10 minutes and reporting failure while the agent is still restoring (#6437, #6973); their terminal results are now persisted torestore_jobslike other restore types (#6974, #6991).- Backup restore surfaces (Overview, Restore Wizard, cleanup history, recovery tabs) format raw backend values consistently instead of leaking driver-internal representations (#6496, #6979); SnapshotBrowser selection now carries through into the Restore Wizard (#6456, #6980).
- Portal: quote/invoice Terms & Conditions collapse into a native, printable
<details>block (with a table of contents for longer terms) instead of a long inline wall of text, and the sign panel moves above it (#6575, #6995). - Devices whose update offer is being withheld (e.g. behind a version gate) now show a persisted reason and "since" date on the device Info tab and an "Updates withheld" badge in the fleet update view, instead of only a one-time log line (#6449, #6998).
Fixed
- Breeze Assist (helper) bootstrap on hosted prod: helper installers are now registered by the local-mode binary sync (#6872, previously zero
component='helper'rows meant no hosted device could bootstrap or upgrade Assist); the agent stops relaunching Assist when it isn't installed, and install retries are bounded with a withdrawn-offer path (#6872, #6921, #6927); a delivered helper response is now preferred over a later session close instead of being dropped (#6918, #6987). Settings → System → Deprecationsno longer 500s on a string-typedfirst_seen_at(#6833).MIN()reboot-required timestamp is coerced to aDateinstead of leaking a raw driver value (#6835).- Security scans: bulk Quarantine/Remove/Restore on a threat no longer writes a terminal status before the agent has actually acted — status now stays at its real pre-action value until the agent reports back, fixing a race where an offline device's threat could show "quarantined" without ever being quarantined (#6685). Threat status/severity badges and pluralization are now correctly localized.
- Invoice line group headers (ticket subject + category) are now frozen at the moment an invoice is issued instead of re-reading
tickets/ticket_categorieslive — renaming, recategorising, soft-deleting or org-moving a ticket no longer rewrites an invoice the customer already received; the authenticated customer portal (org-scoped RLS) can now show the category at all (#6674, #6955, #6975). - A verified backup snapshot's file index is now reset and re-hydrated after the device or snapshot org changes (move-org, org merge) instead of keeping stale tenancy provenance that permanently refused every external-reference download for that snapshot (#6488, #6988).
- SSO: a passkey/WebAuthn login asserting
amr: ["phr"](phishing-resistant, e.g. Pocket ID) is now accepted as satisfying "Trust this provider's MFA," instead of forcing a redundant second factor (#6137, #7006). - A pending hosted partner under a forced-MFA role no longer loops between the inactive-account screen,
/, and MFA setup (#6627, #6967). - Org merge no longer fails with
no merge policy registered for '<table>'when an EE extension (e.g. Workspace) is enabled — extensions can now declare their own org-merge policy for their cascade-registered tables (#4165, #7005). - Live Linux bare-metal restore no longer copies the source machine's
breeze-agent/breeze-watchdogsystemd units and/etc/breezeonto an unenrolled recovery target, which previously left the target crash-looping trying to start services it has no agent installation for (#6436, #6999). - Windows agent: fixed a rare native crash from a recovered nil-pointer fault overflowing a small exception-frame stack reserve on AVX-512/AMX Intel hosts, hit only via a typed-nil error path added in #6883 (#6943, #6997).
- Bare-metal recovery media now learns the server's minimum required ISO version before the one-time recovery code is spent, instead of burning the code on an outdated ISO and leaving the recovery stuck (#5629, #7013).
- AI Operator: the five task-wide policy budgets (v15 spec) are now actually enforced at admission and dispatch instead of being computed but never checked (#6590, #7016).
- MCP: a partner-scoped session can now see and call BYO-MCP org-owned tenant tools (previously silently omitted from
tools/listand refused withUnknown toolontools/call) (#6046, #6992);tools/listpagination now rejects a cursor from a stale tool catalog instead of silently skipping or repeating tools (#6407, #6986). - The PAM-reconciliation rate limiter no longer runs its Redis round-trip inside the request's held DB transaction (#6260, #6976).
- A large post-v0.116.0 pre-release sweep also fixed: AI alert-triage duplicate/no-action notifications (#6750, #6963; #6449, #6932-linked run), monitor conversion equivalence re-validation on partial sourceIds (#6444, #6981), fleet-designer and device-detail paper cuts, billing stale-write guards on time-entry/ticket-part deletes, portal report-type filtering to exclude
msp_staff(#6941, #6965), dev-push uploads staged underDEV_PUSH_WORK_DIRinstead of/tmp(#6621, #6969), and numerous web admin surfaces (toasts, 404 modals, double-fetching alerts, autofill, locale-change re-renders, AI chat first-message visibility while streaming) — see PRs #6939–#6985, #7004, #7007, #7011, #7012 for the full list.
Security
audit_logs.detailsis now redacted onGET /ai/admin/security-events, matching the write-side redaction already applied to new rows; only rows written before the redaction existed, or by call sites that bypassed it, were affected (#6577).- AI org/site tools (
list_organizations,list_sites,get_site,list_org_contacts,add_contact) and shared site-scope auth helpers now fail closed on a malformed (null/non-array)allowedSiteIdsinstead of either 500ing or silently treating it as unrestricted access (#6737, #6790). - AI write tools no longer guess an owner org from the first entry of a caller's accessible-orgs list — a device-page chat could previously create a resource in the wrong customer's org for a technician with several assigned orgs.
manage_configuration_policyupdates now reject an attempted owner-org change instead of silently dropping it (#6667, #6668). #1105system-context DB escalations are retired from two more readers now covered by a partner-wide RLSSELECTbranch, so those reads run under the caller's own tenant context instead of a bypass (#5199, #7008).
Self-Hosting / Upgrade Notes
Upgrade: bump BREEZE_VERSION in .env, then docker compose pull api web portal && docker compose up -d (or pnpm install when running from source).
Database / migrations: 21 new migration files, all idempotent and auto-applying on boot via autoMigrate. None does a large-table rewrite against existing hot data. Two do a bounded, chunked backfill on write (not a blocking rewrite): the invoice-line ticket-subject/category snapshot backfills existing non-draft invoice lines in 5,000-row chunks (2026-10-31-100300), and the backup-snapshot-origin tenancy-reset migration re-checks and resets any complete file index whose recorded org/device no longer matches its snapshot (2026-10-31-100700) — both are one-time, counted (RAISE WARNING), and no larger than the affected row set. The rest add new tables/columns only (hardware health, Gmail mailbox connector, partner API alerts feed with a keyset index built CONCURRENTLY, report history read policies, invoice presentation snapshot, org invoice-terms override, device update-offer-withheld state) plus one column drop:
2026-10-29-100300-drop-legacy-labour-pricing-columns.sqlis the breaking one. It archives every row still carrying legacy labour pricing into a new table,legacy_labour_pricing_archive(full snapshot, not just the skipped rows —skip_reasonnames why the v0.115.0 conversion didn't carry a value into a billing profile), then drops the six legacy columns. The migration refuses to run — the API will not boot — if any partner was never converted to billing profiles, or if manual DDL left a table with only some of its three legacy columns. A normal upgrade path (v0.115.0 → v0.116.0 → v0.117.0) cannot produce either state, but a self-hoster who skipped straight from an older release should run the v0.115.0 conversion first. Any report, BI query, or integration readingticket_categories.default_billable/default_hourly_rate/rate_currencyororg_ticket_settings.default_billable/default_hourly_rate/rate_currencydirectly from the database will fail after this upgrade — repoint it atbilling_profiles/billing_profile_rules/org_billing_profile_assignments, or at the values stamped on each time entry.- Rolling back to v0.116 after this upgrade needs a database restore, not just a
BREEZE_VERSIONrevert — the columns the v0.116 image expects no longer exist, and its tenant-export policy still lists them, so org data export on a v0.116 image against an upgraded database will fail. Take a DB backup immediately before upgrading.
No new required environment variables. New optional env vars, all defaulted off/unset:
MCP_UNATTENDED_TIER3_PRINCIPALS(default unset = nobody) — comma-separated list of principals allowed to run Tier 3 MCP tools without interactive approval. RBAC, the execute allowlist, and the Tier 3 execution ledger still apply regardless.REDIS_MEMORY_MONITOR_INTERVAL_MS/REDIS_MEMORY_WARN_RATIO(default0.8) /REDIS_MEMORY_CAPTURE_THROTTLE_MS/REDIS_MEMORY_MONITOR_DISABLED— tuning/kill-switch knobs for the new Redis memory watchdog, which is on by default with sane defaults and only logs/emits metrics; it never changes Redis'snoevictionpolicy.BREEZE_AI_ARTIFACT_CAPTURE_ENABLED(defaultfalse) — self-host opt-in for large-tool-result capture/read_artifact. Setting ittruewithout an artifact blob store configured (ARTIFACT_S3_BUCKET_<REGION>/S3_BUCKET+ keys) makes the API refuse to boot, so treat it as required only if you opt in.
Behavior changes & flags:
- Hardware & RAID monitoring (#6854) needs agent 0.117.0 — devices on an older agent show no hardware data until updated. Hardware monitors are not attached to any configuration policy by default; attach the four built-ins under Hardware Monitoring to start alerting.
alerts:readis a new opt-in partner-API scope; nothing changes for existing service principals until it's granted.ml.anomalies.enablednow has a real UI toggle at partner and org level; it remains off by default.- Business Reports "All organizations" generation is limited to partner users who can manage partner-wide state (
canManagePartnerWide); other partner users generate one org at a time. - Threat status in
/security/scansno longer flips to a terminal state (quarantined/removed/allowed) at the moment an action is queued — it now reflects the device's real status until the agent reports the command result. A device offline when an action was queued may show its prior status longer than before, which is the correct/truthful state. - Settings navigation changed: several sidebar entries (Roles, SSO, Access Reviews, Enrollment Keys, Custom Fields, Variables, Saved Filters) moved off the sidebar into the new
/settingscatalogue; old URLs still work. - SSO: an identity provider asserting
amr: ["phr"]now satisfies "Trust this provider's MFA" alongsideamr: ["mfa"]— only relevant to partners who already opted into that trust setting. POST /mssql/restoreandPOST /hyperv/restorenow return once the restore is dispatched, not once it completes; pollrestore_jobs/the existing restore UI for the terminal result instead of waiting on the HTTP response.
⚠️ Breaking changes: the legacy labour-pricing column drop above. No other breaking changes in this release.
Full Changelog: v0.116.0...v0.117.0
What's Changed
- feat(ai-tools): A-W05 output efficiency — honest paging, row shaping, redact-then-capture, read_artifact by @ToddHebebrand in #6738
- docs(ai): measured 90-day tool hot/cold list (EU + US) in the A-W01 baseline by @ToddHebebrand in #6746
- docs(ai): in-product AI full-control design (feature #6754) by @ToddHebebrand in #6761
- fix(reports): refuse report authority for out-of-service tenants (#6699) by @ToddHebebrand in #6716
- docs(spec+plans): System page — connection status + deprecations (#6768) by @ToddHebebrand in #6747
- fix(web): webhook edit forms round-trip redacted secrets instead of breaking (#4983) by @ToddHebebrand in #6753
- fix(agent,web): name the certificate fix when a self-signed server fails install (#4979) by @ToddHebebrand in #6760
- fix(scripts): show custom-field write-back outcome in the test runner (#6537) by @ToddHebebrand in #6763
- fix(agent,helper): stop Breeze Assist instances accumulating in one session (#6251) by @ToddHebebrand in #6764
- fix(software): archive once-deployed catalog packages instead of refusing delete (#4980) by @ToddHebebrand in #6765
- feat(api): metric anomaly episodes W02 — routes, actions, alert auto-resolve, dispatch per episode (#6652) by @ToddHebebrand in #6729
- feat(web,api): Settings → System → Deprecations report (#6605) by @ToddHebebrand in #6744
- docs: sync v0.116.0 delta (business reports, anomaly evaluation) by @ToddHebebrand in #6774
- docs(ai): W02 plan — PSA + billing write tools (feature #6754) by @ToddHebebrand in #6809
- fix(ai-tools): fail closed on a non-array allowedSiteIds in org/site tools (#6737) by @ToddHebebrand in #6787
- feat(backup): W06a — NTFS security descriptors, Windows layout guards, wingpt codec (Part of #5499) by @ToddHebebrand in #6775
- feat(web): episode-based device anomalies panel (#6650 W04) by @ToddHebebrand in #6825
- feat(api): System page connection status report (#6769) by @ToddHebebrand in #6773
- feat(web): System page with Connections and Deprecations tabs (#6770) by @ToddHebebrand in #6826
- feat(anomalies): record episode-level feedback on resolve/dismiss (#6650) by @ToddHebebrand in #6828
- feat(reports): business reports W03 — templates, options forms, ownership, locales, docs (#3198) by @ToddHebebrand in #6813
- fix(agent): read helper version from the installed binary and verify MSI upgrades (#6252) by @ToddHebebrand in #6752
- fix(search): point the "Security settings" shortcut at the page that manages MFA (#6748) by @ToddHebebrand in #6791
- feat(web): sample CSV + import-guide link on org bulk import (#6051) by @ToddHebebrand in #6815
- feat(web): open Devices on the Agent segment and remember the last choice (#5874) by @ToddHebebrand in #6816
- feat(devices): persist and show the installed helper version (#6751) by @ToddHebebrand in #6824
- fix(topology): checkpoint the ingest soak artifact every round and on abort by @ToddHebebrand in #6710
- fix(quotes): use proposal title + customer name in quote email, warmer default copy by @ToddHebebrand in #6814
- fix(ai): stop the prompt-injection sanitizer rewriting pasted logs and XML (#6695) by @ToddHebebrand in #6707
- fix(api): deprecations report 500s on string first_seen_at by @ToddHebebrand in #6833
- fix(agent): skip the consent-helper wait when nobody is signed in to the RDS target (#6812) by @ToddHebebrand in #6817
- fix(webhooks): enable/disable toggle works and legacy headers survive edit (#6767) by @ToddHebebrand in #6821
- fix(api): clear agent monitoring watches when no policy applies (#2949) by @ToddHebebrand in #6822
- feat(ai): configurable interactive AI approval timeout, 5–60 min, partner default + org override (#6475) by @ToddHebebrand in #6829
- feat(api): adopt ERROR_CODES on remote/* session errors (i18n Phase 3, Wave E2a) by @fabicarvano in #6683
- chore(deps): bump the github-actions group with 4 updates by @dependabot[bot] in #6741
- fix(tickets): restamp SLA targets on category/priority change before first response (#6691) by @ToddHebebrand in #6837
- feat(scripts): raise alerts from the per-script exit-code severity mapping (#6690) by @ToddHebebrand in #6838
- feat(monitors): W05c2 PR 1 — conversion web: Needs-conversion panel, Convert everything, admin sweep page, ledger + Undo (#6371) by @ToddHebebrand in #6644
- feat(billing): W04a — work-type pickers on mobile + Outlook add-in, billables export dimensions, Rates docs (#4628) by @ToddHebebrand in #6718
- fix(api): coerce MIN() reboot-required timestamp to a Date (#6835) by @ToddHebebrand in #6839
- fix(api): stream the backup GC listing instead of materialising the bucket (#6834) by @ToddHebebrand in #6840
- fix(api): short TTL for failed latest-version fetch, 10s timeout (#6629) by @ToddHebebrand in #6844
- fix(patch): commit the patch-job claim before fanning out device jobs (#6632) by @ToddHebebrand in #6848
- feat(reports): read-only report history for inactive orgs (#6771) by @ToddHebebrand in #6850
- feat(monitors): W05c2 PR 2 — alert workflow filters, device Monitoring tab, Alert Templates removed, composite/restart controls, library Recommended (#6371) by @ToddHebebrand in #6724
- fix(monitors): attach/detach keep a monitors link's inheritance (#6371) by @ToddHebebrand in #6842
- feat(invoices): freeze invoice theme/page size at issue + backfill, draft tax org→partner (#6227) by @ToddHebebrand in #6846
- feat(ai): per-tool AI/MCP rate-limit multiplier in AI budget settings (#6476) by @ToddHebebrand in #6852
- feat(billing)!: W04b — archive then drop the six legacy labour-pricing columns (#6335) by @ToddHebebrand in #6863
- feat(billing): partner identity falls back to company details (W05 #6228) by @ToddHebebrand in #6845
- docs: hardware & RAID monitoring — spec, plan index and seven wave plans (#6854) by @ToddHebebrand in #6866
- feat(billing): org-level payment terms override (#6229) by @ToddHebebrand in #6865
- feat(hardware): W01 API contract — tables, ingest, rollup, GET, AI tool, config feature (#6854) by @ToddHebebrand in #6882
- feat(agent): W02a hardware health core — hwhealth package, scheduler, breaker, storcli/mdadm/Storage Spaces/Windows disks/smartctl (#6854) by @ToddHebebrand in #6879
- feat(monitors): W05c2 PR 3 — AI tools + Fleet Designer write monitors, three-facet docs + release notes (#6371) by @ToddHebebrand in #6725
- feat(agent): W02b hardware sources — MegaCli, ssacli, arcconf, omreport, zfs, Broadcom precedence, tool_dirs (#6854) by @ToddHebebrand in #6880
- feat(alerts): W03 hardware alerting — subject_key, per-subject sweep, hardware_health kind, built-ins v3 (#6854) by @ToddHebebrand in #6887
- test(alerting): W05c2 Task 18 — verification runner, live ledger RLS proofs, ledger name fix (#6371) by @ToddHebebrand in #6890
- feat(web): W04 hardware health — Storage & RAID section, device-list column/filter, docs (#6854) by @ToddHebebrand in #6893
- feat(hardware): W05 BMC in-band — bmc source, agent_report link, linker gates, Management controller card (#6854) by @ToddHebebrand in #6894
- docs(hardware): W06 lab proof evidence + release note (#6854) by @ToddHebebrand in #6897
- fix(agent): smartctl leaves disk size unknown when capacity is absent (#6896) by @ToddHebebrand in #6898
- fix(hardware): stable Storage Spaces member keys + resolve stale subjects on parent recovery (#6895) by @ToddHebebrand in #6899
- chore(deps): bump tauri-plugin-single-instance from 2.4.4 to 2.4.5 in /apps/viewer/src-tauri by @dependabot[bot] in #6900
- chore(deps): bump tauri from 2.11.5 to 2.11.6 in /apps/helper/src-tauri by @dependabot[bot] in #6901
- chore(deps): bump tauri-plugin-updater from 2.11.0 to 2.12.0 in /apps/viewer/src-tauri by @dependabot[bot] in #6902
- test(llm-egress): start the proxy before picking the refused port (#6853) by @bdunncompany in #6884
- fix(ai-tools): count every script execution status in get_script_details stats (#5322) by @bdunncompany in #6886
- feat(mcp): opt-in MCP_UNATTENDED_TIER3_PRINCIPALS for trusted unattended agents by @bdunncompany in #6841
- feat(mcp): partner-wide scripts readable by org API keys; contentSha256 + run_script content pin by @bdunncompany in #6867
- fix(agent): ship error-valued log fields as their text, not {} (#6622) by @bdunncompany in #6883
- fix(api): report swallowed result-handler failures to Sentry (#3530) by @bdunncompany in #6889
- fix(wt-stack): pin the WebAuthn origin and RP ID to the stack's caddy port (#6443) by @bdunncompany in #6885
- fix(web): surface destructive-confirmation failures via runAction (#3531) by @bdunncompany in #6892
- fix(web): keep effects from re-running on locale change (#3632) by @bdunncompany in #6891
- fix(ai-agents): exclude warranty/lifecycle alerts from triage admission (#6749) by @ToddHebebrand in #6877
- fix(inbound-email): no silent loss on transient reauth; record-or-rethrow failure handling by @bdunncompany in #6881
- fix(patch): enqueue policy run-now patch jobs after the write commits (#6849) by @ToddHebebrand in #6876
- fix(audit): redact audit_logs.details on admin/audit read routes (#6577) by @ToddHebebrand in #6875
- fix(agent): fail fast on run-as-user scripts to a session with no signed-in user (#6820) by @ToddHebebrand in #6871
- fix(ai): compliance/alert_rule guidance matches the evaluator (#6669) by @ToddHebebrand in #6676
- docs(qa): v0.116.0 delta 2 sweep at tag move to 2abb942 by @ToddHebebrand in #6743
- chore(deps): bump tauri from 2.11.5 to 2.11.6 in /apps/viewer/src-tauri by @dependabot[bot] in #6903
- feat(ai): W05 — classify every AI tool-coverage gap (build/exempt/defer) (#6759) by @ToddHebebrand in #6810
- perf(inventory): diff+upsert device_disks/device_network instead of DELETE+INSERT (#6698) by @ToddHebebrand in #6851
- fix(billing): deleteTimeEntry rejects zero-row delete instead of emitting side effects (#6620) by @ToddHebebrand in #6873
- fix(remote): report and audit the true consent reason for unsolicited-consent starts (#6819) by @ToddHebebrand in #6878
- feat(ai-tools): shape the 7 production-hot tools A-W05 missed (#6745) by @ToddHebebrand in #6811
- feat(settings): anomaly-detection toggle at partner and org level by @ToddHebebrand in #6538
- feat(portal): add per-asset network visibility endpoint (PR 2 of #5861) by @fabicarvano in #6630
- fix(ai): AI can now see scheduled patch jobs for a device (#6665) by @ToddHebebrand in #6677
- feat(discovery): network devices can change site; profile site change is real by @ToddHebebrand in #6766
- feat(backup-providers): W03 read model + web — Integrations Backup tab, health overview, device card by @ToddHebebrand in #6610
- fix(auth): site-scope helpers fail closed on a malformed allowlist (#6790) by @ToddHebebrand in #6874
- fix(ai): release agent manage_alerts intents as the approver (#6907) by @ToddHebebrand in #6912
- fix(patching): winget no-applicable-upgrade and superseded WUA updates are skipped, not failed (#6910) by @ToddHebebrand in #6915
- fix(ai): deep-link notifications to the right approval/run/proposal card by @ToddHebebrand in #6914
- fix(ai): narrow full-run tool exposure + verdict transient-pattern hint by @ToddHebebrand in #6916
- fix(ai): AI writes never guess the owner org; config-policy update rejects owner change (#6667, #6668) by @ToddHebebrand in #6680
- feat(backup): W06b — Windows rebuild engine core: WinSystem seam, winhive, platform table, VHDX provisioning + restore, real-VHDX CI gate (Part of #5499) by @ToddHebebrand in #6906
- fix(ai-agents): no-action alert-triage runs don't spam run-finished notifications (#6908) by @ToddHebebrand in #6913
- Native Gmail / Google Workspace inbound mailbox connector by @bdunncompany in #6740
- feat(partner-api): read-only alerts feed behind opt-in alerts:read scope by @bdunncompany in #6847
- fix(api): register Breeze Assist helper installers in local-mode binary sync (#6872) by @ToddHebebrand in #6920
- fix(agent): stop relaunching Breeze Assist when it is not installed (#6872) by @ToddHebebrand in #6921
- feat(backup): W06c — Windows bare-metal rebuild: offline hives, host bcdboot/DISM, identity, BitLocker intent, OS-state validate (Part of #5499) by @ToddHebebrand in #6928
- fix(agent/backup): bound verify/test-restore downloads and keep partial counts (#6598) by @ToddHebebrand in #6929
- fix(web): business report edit dead sections, template i18n noise, archived org overview (sweep v0.116.0) by @ToddHebebrand in #6939
- fix(web): admin sweep fixes — toasts, 404 modals, alerts double-fetch, de-DE title, SP scopes, autofill by @ToddHebebrand in #6944
- fix: monitor conversion, fleet design and device-detail paper cuts (v0.116.0 sweep D2-D8, D15) by @ToddHebebrand in #6946
- feat(settings): Suggested fixes toggle on the AI Features cards (#6934) by @ToddHebebrand in #6938
- fix(backup,remote): sweep D9/D10/D11/D13 — backup provider test sync, raw enums, linked-device dedupe, session error prose by @ToddHebebrand in #6945
- fix(agent): bound manifest download by a no-progress window, not a 5 min total (#6929 regression) by @ToddHebebrand in #6947
- fix(backup): drop only the no-jobs placeholder row for a provider-linked device (sweep D11) by @ToddHebebrand in #6949
- fix(ticketing): serve M365 mailbox app id at runtime for the policy snippet (#6935) by @ToddHebebrand in #6937
- feat(ai-tools): manage_ticket_checklist MCP tool; guard replace_unticked against waiting Operator steps (#6930) by @bdunncompany in #6931
- qa: v0.116.0→main pre-release sweep (0 FAIL) + #6850 suspended-org history fix and 3 paper cuts by @ToddHebebrand in #6933
- fix(tickets): route mailbox consent callback failures back to the card (#6936) by @ToddHebebrand in #6942
- fix(alerts,ai): sweep v0.116.0→main fixes E1-E3,E5-E8 + issue #6932 by @ToddHebebrand in #6948
- fix(checklists): apply-template waiting-step refusal gets its own translated message (#6931 review) by @bdunncompany in #6951
- fix(billing): v0.116 sweep billing paper cuts (C1–C4) by @ToddHebebrand in #6940
- fix(agent): bound Breeze Assist install retries and clear a withdrawn offer (#6927) by @ToddHebebrand in #6954
- ci(agent): Windows agent tests on the classic GC to A/B the Green Tea crash (#6943) by @ToddHebebrand in #6956
- feat(portal): network asset alert/ticket enrichment (#5861 PR 3) by @fabicarvano in #6950
- ci(mobile): stop packages/** from triggering the iOS native build by @ToddHebebrand in #6957
- test(email-domains): one clock for the sending-stats integration file (#6953) by @bdunncompany in #6959
- fix(ai-agents): skip ungrouped verdict run when a full triage already covers the alert (#6750) by @ToddHebebrand in #6963
- fix(agent): wrap onClose markOffline context prologue to stop unhandled rejections (#6836) by @ToddHebebrand in #6964
- fix(auth): stop pending-partner + forced-MFA redirect loop (#6627) by @ToddHebebrand in #6967
- fix(api): stage dev-push uploads under DEV_PUSH_WORK_DIR, not /tmp (#6621) by @ToddHebebrand in #6969
- fix(api): expose Redis used_memory/maxmemory telemetry + 80% warning (#6452) by @ToddHebebrand in #6968
- fix(security): keep IOC threat status pending until agent reports back (#6685) by @ToddHebebrand in #6966
- fix(quotes): editable per-quote footer line (#6648) by @ToddHebebrand in #6970
- docs(qa): v0.116.0 sweep follow-up verification at main f9939e8 by @ToddHebebrand in #6977
- fix(analytics): remove QueryBuilder metrics with no metricColumnMap entry (#6832) by @ToddHebebrand in #6972
- fix(api): dispatch MSSQL/Hyper-V restore async instead of a 10-minute blocking wait (#6437) by @ToddHebebrand in #6973
- fix(billing): snapshot ticket subject + category onto issued invoice lines (#6955) by @ToddHebebrand in #6975
- fix(portal): exclude msp_staff report types from portal run reads (#6941) by @ToddHebebrand in #6965
- fix(agents): keep the pam-reconciliation rate limiter out of the held request transaction (#6260) by @ToddHebebrand in #6976
- fix(web): carry SnapshotBrowser selection into RestoreWizard (#6456) by @ToddHebebrand in #6980
- fix(backup): bound backup GC memory in reconcile, local walk, unlimited-cap sweep (#6843) by @ToddHebebrand in #6984
- fix(mcp): bind tools/list pagination cursor to a catalog fingerprint (#6407) by @ToddHebebrand in #6986
- fix(ai-chat): keep the first message of a new session visible while streaming by @ToddHebebrand in #6978
- fix(monitors): re-validate equivalence proof for partial conversion sourceIds (#6444) by @ToddHebebrand in #6981
- fix(ai): extend users-FK user-owned-release contract to every aiTools module (#6911) by @ToddHebebrand in #6982
- fix(paper-cuts): pass-3 release-sweep low-severity fixes (#6497) by @ToddHebebrand in #6985
- fix: v0.116.0 sweep follow-up paper cuts (A4, F1, F2, F3, F5-F9) by @ToddHebebrand in #6983
- fix(api): persist mssql/hyperv restore results via restore_jobs (#6974) by @ToddHebebrand in #6991
- fix(web): custom fields selectable in advanced filter + opt-in device list column (#6594) by @ToddHebebrand in #6990
- feat(web): settings catalogue at /settings + More settings sidebar entry (#6220) by @ToddHebebrand in #6994
- fix(portal): collapse T&C and move sign panel above the agreement (#6575) by @ToddHebebrand in #6995
- feat(mobile): navigate and defer across pending approvals (#6212) by @ToddHebebrand in #6996
- fix(agent,backup): live Linux BMR restore skips the source's breeze-* units and /etc/breeze (#6436) by @ToddHebebrand in #6999
- fix(api): org merge handles extension-owned org tables via manifest merge policies (#4165) by @ToddHebebrand in #7005
- fix(api): accept amr phr as trusted upstream MFA (#6137) by @ToddHebebrand in #7006
- fix(agent): de-flake rebuild loopback test partition lookup (#6827) by @ToddHebebrand in #7007
- fix(api): throttle unmatched backup_progress lookups and logs (#5393) by @ToddHebebrand in #7011
- fix(backup): re-verify snapshot origin provenance after a device org-move (#6488) by @ToddHebebrand in #6988
- fix(mcp): thread access-checked target org into tenant tool resolution (#6046) by @ToddHebebrand in #6992
- fix(agent): prefer a delivered helper response over a later session close (#6918) by @ToddHebebrand in #6987
- fix(agents): persist edition-offer-withheld state per device (#6449) by @ToddHebebrand in #6998
- fix(web): confirm silent mutation surfaces via runAction (#5313) by @ToddHebebrand in #7004
- test(api): multi-tenant fixture for the CI migration replay (#5361) by @ToddHebebrand in #7012
- feat(api): decouple large-tool-result capture from the AI-workspace flag (#6732) by @ToddHebebrand in #7014
- fix(bmr): gate recovery-media version before the one-time code is claimed (#5629) by @ToddHebebrand in #7013
- fix(api): enforce AI Operator task-wide policy limits at admission and dispatch (#6590) by @ToddHebebrand in #7016
- fix(backup): format raw values across Overview, Restore Wizard, cleanup history, and recovery tabs (#6496) by @ToddHebebrand in #6979
- fix(api): retire #1105 escalations covered by partner-wide RLS SELECT branches (#5199) by @ToddHebebrand in #7008
- fix(agent): detect typed-nil errors without taking a nil-pointer fault (#6943) by @ToddHebebrand in #6997
- docs: move security contact to security@breezermm.com by @ToddHebebrand in #7020
- chore(release): What's New entry for v0.117.0 by @ToddHebebrand in #7031
Full Changelog: v0.116.0...v0.117.0