Breeze RMM v0.126.0 — alerts that reach your PSA, device groups across every organization, and Jobs moving to Flows. Also in this release: Microsoft 365 and Google Workspace backups from NinjaOne SaaS Backup (Dropsuite) with organization-level alerts, and Breeze AI that deploys software, runs contract billing and places Pax8 orders with a second person's approval.
⚠️ Behaviour change: Flows is on by default. FLOWS_ENABLED now defaults to true. With Flows on, New job opens Flows, the Jobs page offers Move to Flows, and POST /api/v1/automations answers 410 automations_moved_to_flows. Existing Jobs keep running and stay editable until you switch them. Whether your install actually turns Flows on depends on your Compose file and .env; see Behaviour changes and feature flags. To keep Flows off, set FLOWS_ENABLED=false (#10700).
⚠️ Behaviour change: DNS Security stops storing allowed queries by default. Every existing integration stores blocked and redirected queries only after the upgrade, unless you turn on Store allowed traffic for it. Allowed rows already stored are kept until retention removes them (#10707).
Summary
- Alerts reach your PSA and your webhooks (#10528: #10576, #10594, #10596, #10670, #10673, #10783, #10830, #10861, #10938).
- Partner administrators can create All organizations webhooks that receive events from every organization they manage.
- New webhooks get alert payload v2 (status, hostname, site, organization, alert link, external ticket references). Existing webhooks stay on v1 byte for byte.
- Failed deliveries retry for about 21 hours (1 min, 5 min, 30 min, 2 h, 6 h, 12 h), with the retry state kept in Postgres.
- The Partner API gains an opt-in
alerts:writescope to acknowledge and resolve alerts and to attach external ticket references. Ticket create acceptsalertId. - ConnectWise Manage alert tickets, opt-in per connection: Breeze opens, updates and closes a ticket for each qualifying alert, and alert pages show the linked ticket. You can create one by hand, see per-state counts and re-drive failures. This has not yet been verified against a live ConnectWise Manage tenant.
- Device groups that span every organization (#10521: #10603, #10639, #10672, #10690, #10706; plus #10704, #10780, #10800, #10805).
- Partner administrators with access to all organizations can create dynamic All organizations groups and assign them from partner configuration policies. Organization users see the group's name and their own devices, read-only.
- Dynamic group rules can match a software version (below, at least, equal) and a software vendor.
- The Devices list gains Export CSV (every matching device, visible columns), a Warranty Ends column with a Warranty Status filter, and bulk Add to group… / Remove from group… for static groups.
- SaaS backup and alerts that are not about a device (#10598: #10703, #10708, #10721; #10725: #10733, #10835, #10836, #10837, #10856).
- Microsoft 365 and Google Workspace backups from NinjaOne SaaS Backup (Dropsuite) appear next to Cove in backup health, the portal and reports. The connection is read-only status.
- SaaS backup failures, including Cove Microsoft 365 workloads, raise organization-level alerts that flow through notifications and automations. Device-only automations skip them.
- A topology alert keeps its history and PSA ticket links when the device that raised it is deleted.
- Jobs move to Flows (#5215: #10313, #10344, #10685, #10700).
- Move to Flows on the Jobs page shows how each Job would convert (Exact, Needs review or Can't move yet, with the reason). It runs the draft flow in shadow next to the Job and switches over only when you say so. Each trigger occurrence is run by the Job or by the flow, never both.
- A switched Job's webhook URL keeps working and forwards to the flow. Revert turns the Job back on at once.
- Flows gain a webhook tab, visible run limits and Settings → Flow limits (partner default, organization override that can only lower it).
- Breeze AI covers software, billing and Pax8 (#6754: #10319, #10343, #10352, #10373, #10709, #10827, #10832).
- New tools for the software catalog and deployments, device inventory and operations, live event-log browsing, tenant variables and Quick Support sessions.
- Contract billing: preview and generate an invoice, and push invoices to QuickBooks or Xero. Generating and pushing need a second person's approval.
- Pax8: integration status, product search with live pricing, subscription drift and order drafts. Submitting an order needs two-person approval of the estimated cost.
Added
- PAM: an elevation the end user declined on the device (Deny, timeout or dialog error) can no longer be approved and launched afterwards. Requests show a Withdrawn status and filter (#10374, #10420, #10689). Standard users who send a request to IT on Windows are told whether it was approved, denied or expired, with the technician's reason (#10395, #10786).
- On-device dialogs (#10190, opt-in, nothing enabled by default): branded notice cards, restart prompts, remote-consent cards, a clickable remote-session pill and elevation request cards drawn by Breeze Assist. They are switched on per kind with
PROMPT_HOST_ENABLED_KINDS(#10310, #10314, #10339, #10340, #10341, #10347, #10348, #10349, #10350, #10351, #10691, #10693, #10694). A new remote access policy toggle, Let the user end the session (default on), applies once the remote-session kind is enabled (#10354, #10355). - Alert webhook events:
alert.suppressednow fires from every suppress path,alert.escalatedis published once per escalation step, and the event picker offers Ticket Merged (#10788, #10793). - Event logs: an Event Logs configuration policy can add up to 20 Application providers whose Warning and Information events are collected (#10720). APC PowerChute (
APCPBEAgent) Warning and Information events are collected by default (#10566). The Windows Security category now collects audit events such as failed logons and lockouts (#10702). - EDR: a read-only Emsisoft cloud management console adapter (endpoints and detections, no actions) (#10159).
- Update rings: Linux package block and pin rules (#10821).
- Public proposal link: Download PDF for clients without a portal account (#10787). A reopened agreement link that signed the agreement offers the certified signed copy (#10798).
- Contracts created by an accepted quote link back to it, and the contracts list marks them From Q-… · ready to activate (#10790).
- Portal: physical placement on network assets behind the
enablePhysicalPlacementsetting, and WAN/circuit details on asset detail (#10176, #10763, #10333). - Ticket import brings attachments (#10064). A moved external reference records its origin ticket on merge (#10287).
- Partner settings: inheritance drill-down per setting and a partner Known Guests tab (#10363). The AI tool
get_partner_settings_inheritanceanswers which organizations override a partner setting (#10820). - Breeze AI: per-device history in
get_script_execution_history(#10817); ticket, quote, invoice, contract, organization and site pages tell the chat what you are looking at (#10449); ticket merge andsystem_cleanupcancel work from chat (#10813). - Wisp (Breeze Cloud only,
BREEZE_WISP_ENABLED): a per-thread working set with pins and automatic links, Talk to Wisp about this, a model menu on the home thread and a fresh session at the turn limit (#10434, #10834, #10833, #10419). - Groundwork for network isolation. It is not available yet and is switched off; see Behaviour changes and feature flags (#10088).
Improved
- Alerts: acknowledged or suppressed alerts now resolve on their own when the condition clears, and event-log alerts re-open only on new events (#10769). Warranty-expiry alerts are graded as lifecycle notices instead of critical (#10447).
- Remote desktop: the idle timeout default is 30 minutes instead of 5 (#10797). The viewer says why a session ended (#10637).
- The legacy Windows restart box defaults to Postpone, so Enter no longer restarts the machine (#10350).
- DNS Security: the Events tab loads in bounded pages with Load more (#10469, #10940).
- Reports: Excel export is a real
.xlsx(#10568). - Branding: the organization's primary colour reaches quotes and invoices (#10543). Partner Custom CSS applies to every child organization's portal (#10441). The portal landing and sign-in pages show the organization's welcome message (#10439).
- Quotes: the editor edits Valid until and intro notes (#10458).
- Software version manager: adding a version takes install scripts and zip packages, as Add Package does (#10812). A failed install shows the vendor's reason (#10631).
- Reliability: Crashes, Application hangs and Hardware errors link to their own event-log sources (#10816).
- Organization defaults save only changed fields and can be reset to their default (#10582).
- IOC sweeps: Rules changed since this sweep started appears only when a scan failed for that reason (#10811). Progress names cancelled and failed devices (#10610). Scan now goes through the dispatch caps and can be cancelled (#10714).
- Breeze AI: device and alert lists name each row's organization for multi-organization callers (#10784).
manage_groupsadd and remove ask for approval and refuse the whole call instead of skipping devices (#10822).search_documentationreturns the matching section text (#10451). - Command palette quick actions are searchable (#10480). The AI and Help side panels dock below the header (#10483). Device overview layout pass (#10317).
- API load: the alert worker's database pool use is bounded and spread across each minute, bulk ingest inserts are chunked, and agent connection inventories keep the 2,000 most useful rows per device (#10864). Metric rollup compaction no longer waits on locks (#10855).
Fixed
- Alerts and monitors:
- a partial
PATCH /monitor-definitions/:id, including the list's enable toggle and the AI enable/disable, no longer resets omitted settings to their defaults (#10939); {{description}}and{{conditionsMet}}are filled on new monitor alerts, and event-log alerts fill{{count}},{{category}}and{{windowMinutes}}(#10743, #10940);- the legacy
[monitor]prefix is stripped from network check alerts (#10640); - correlation groups show Open instead of a raw key (#10940);
- the alert worker warns about a backlog only when jobs are really waiting (#10940).
- a partial
- PSA:
/integrations/psano longer crashes once an alert ticket exists (#10938). - Devices: the CSV export fills the Warranty Ends column, and the warranty card no longer shows a date one day early west of UTC (#10940). Dynamic groups re-evaluate on warranty changes and on software inventory changes, and leave decommissioned devices out (#10877, #10569, #10609).
- DNS Security: Last 90 days on the Events tab loads instead of failing (#10940).
- Agent (macOS): YARA engine signing (#10881); the helper reloads after an update instead of staying unloaded (#10873); per-user state directory and OpenH264 (#10872); a TCC grant that preflight still denies is explained (#10875); a locked Mac's display stays awake for remote sessions (#10876); VideoToolbox warm-up (#10882).
- Agent (Windows): BitLocker probes run only where BitLocker is available (#10906); disk inventory survives slow reliability counters (#10776); password policy read through
secedit(#10473); winget error0x8A15002Bretried unscoped (#10465); per-user winget patches dispatched (#10464); the UAC prompt closes after an approve or deny (#10369, #10825); Windows event logs are no longer skipped (#10702). - Agent (all): repeated Linux and macOS events from one process are kept (#10779); the helper no longer drops its connection when a read times out mid-message (#10775); a crash-looping Breeze Assist is now reported (#10806, the v0.125.0 known issue #10302); upgrades back off after a verification failure (#10687), and local-mode servers withhold upgrades they cannot serve (#10686); the sensitive-data scan covers user profiles (#10461).
- Event-log uploads are validated per row, so one bad event no longer drops the whole batch (#10698).
- Discovery auto-links an asset to a device by MAC only (#10323).
- Patching: deleting or disabling a ring cancels its undispatched work (#10710), deleting a ring asks for its name (#10683), and the device install poll stops on an outcome (#10471).
- Compliance: one failing device no longer freezes the whole scan (#10648).
- Billing, quotes and agreements: Checkout idempotency is tied to the invoice (#10778); time held by a block is not invoiced (#10684); a quote with no lines cannot be sent or accepted (#10467); the agreement certificate wording is versioned (#10711); customers see the template name, not the internal label (#10654); an accepted public quote keeps its payment step (#10688).
- Sign-in and profile: delete a lost passkey with a recovery code (#10671); the MFA method is cleared when MFA is disabled (#10436); avatar refresh and logout identity (#10252).
- Integrations: UniFi Site Manager lists every page of hosts and sites and stops filing one customer's devices under another (#10570); the Microsoft 365 mailbox poll is time-bounded (#9445).
- Topology: no more false stale supplies or fractional page counts (#10324).
- A large batch of web fixes from the October demo-video audit: toasts, labels, filters, locale strings and read-only merged tickets.
Security
This release includes security hardening across:
- MCP: an OAuth intent is refused at release once the requester's authentication epoch has moved (#10819);
- Huntress webhooks, now verified as Standard Webhooks, with the
Webhook-Signatureheader redacted from Caddy access logs (#10590, #10602); - step-up resource digests, which canonicalise UUID ids (#10342), and invites, which refuse scope restrictions the scope cannot honour (#10628);
FORCE_HTTPS, which now lets in-cluster server-side rendering through by socket peer instead of the Host header (#10681);- reserved brand names ("Microsoft", "Windows Security", "Apple Help Desk" and similar) refused as partner or organization names; device prompts fall back to "Your IT support team" (#10818);
- development Compose stacks bound to loopback, and a password on the legacy Redis (#10346);
- dependency advisories: node-forge 1.4.2 for GHSA-86w9-cpqp-85rv (#10770), and pypdf 6.21.4 in the AI workspace image for seven high-severity denial-of-service CVEs, CVE-2026-119203 to CVE-2026-119209 (#10920).
Self-hosters are encouraged to upgrade.
Self-Hosting / Upgrade Notes
Upgrade command. Check how your install pins its images: grep '^BREEZE_API_IMAGE_REF=' .env.
- Digest-pinned (the value ends in
@sha256:…; everyguided-setup.shinstall from v0.112.0): fetch the currentguided-setup.shfrommain, then runbash guided-setup.sh --upgrade 0.126.0. It verifies the signed image inventory and updatesBREEZE_VERSIONand all four image digests together. Then it pulls and restarts. - Tag-form (the value ends in
:${BREEZE_VERSION}): bumpBREEZE_VERSION=0.126.0, then rundocker compose pull api web portal && docker compose up -d(andpnpm installif you build from source). If you run the optionalworkercontainer, pull and restart it too. - Do not edit only
BREEZE_VERSIONon a digest-pinned install. That re-pulls the images you already run. - Replace every API and worker instance in the same deploy. Webhook retry state moves from Redis to Postgres in this release, so do not leave a v0.125.0 instance running next to it.
--upgradedoes not change yourdocker-compose.yml. To pick up this release's new Compose mappings (listed under Environment variables) and the newFLOWS_ENABLEDdefault, take the v0.126.0docker-compose.yml/deploy/docker-compose.prod.yml, or add the lines to theapiservice'senvironment:block yourself. A value only in.envdoes not reach the container.- See the Upgrade Guide.
No breaking changes for an install on default settings. If you integrate with the API, check these before you upgrade:
POST /api/v1/automationsanswers410 automations_moved_to_flowswhile Flows is on. Create flows instead, or setFLOWS_ENABLED=false. Editing and running existing Jobs is unchanged until they are switched (#10700).GET /orgs/organizations/:id/effective-settingslists a partner field inlockedonly when the partner value wins. Partner defaults an organization may override move to a newpartnerDefaultslist (#10814).- Partner and organization names that are only a reserved brand now return
400on create and update (#10818). - AI
manage_groupsadd_devices/remove_devicesnow need approval and returnalreadyMembers/notMembersinstead ofskipped(#10822).query_devicesandmanage_alertslistreturn 20 and 12 rows by default (were 25 and 15) (#10784).
Database.
- 56 migrations. They are idempotent and apply automatically on boot via
autoMigrateunlessAUTO_MIGRATE=false. Expect[auto-migrate] Applied 56 migration(s)from v0.125.0. No shipped migration was modified, renamed or removed. All 56 passed an upgrade test from a v0.125.0 schema as a non-superuser role, including a re-run and a variant withoutBYPASSRLS. - Large installs: plan a quiet window for
alerts,webhook_deliveriesandincidents. On a small install these files take seconds. On a large one, check sizes first, for exampleSELECT pg_size_pretty(pg_total_relation_size('alerts')), and repeat forwebhook_deliveriesandincidents. The migrations were not timed against production-size data.alertsis locked for the whole of the owner-kind migrations (2027-01-18-100000-alerts-owner-kind.sql,2027-01-18-130000-alerts-owner-kind-device-topology-chk.sql, #10733, #10835). In one transaction they makedevice_idnullable, backfill topology alerts, validate a new CHECK with a full scan and build a unique partial index withoutCONCURRENTLY. The second file updates stragglers and validates the CHECK again. Alert reads and writes wait until each file finishes.webhook_deliveriesgains anorg_idcolumn with a foreign key validated by a table scan (2027-01-13-100000-webhooks-partner-ownership.sql). It is then backfilled in 10,000-row batches inside one transaction, so locks are held until the whole backfill commits (2027-01-13-100100-webhook-deliveries-org-id-backfill.sql, #10670). If you keep a long delivery history, consider pruning it before the upgrade.incidentsandincident_actionseach gain a unique(id, org_id)constraint built withoutCONCURRENTLY(2027-01-17-200000-device-network-isolations.sql).- The other hot-table changes use the safe patterns:
devicescolumns with constant defaults (metadata only); concurrent index builds onalerts,webhook_deliveries,ticket_attachmentsanddns_security_events;alertsforeign keys addedNOT VALIDthen validated without blocking writes;ai_invocationsCHECK addedNOT VALIDthen validated.
- Smaller backfills:
contracts.source_quote_idfrom executed agreements and Pax8 orders (#10790); contract document template names; network monitors (legacy[monitor]prefix), PSA mappings (duplicate rows removed), Wisp tables, andai_model_assignmentsrows for the retiredpatch_testsurface (deleted). Each file that writes rows elects system scope first. - New tables
flow_automation_conversions,automation_occurrence_claims,alert_external_refs,device_network_isolationsandai_operator_account_reservationsenable and force row-level security in the file that creates them.device_groups.org_idbecomes nullable for partner-owned groups. - One-way enum additions:
elevation_statusandelevation_audit_event_type+withdrawn;webhook_delivery_status+scheduled;ai_tool_status+refused;config_feature_type+containment. - Privileged DDL. There is no
CREATE ROLE,OWNER TO,CREATE EXTENSIONor schema-level grant. TwentySECURITY DEFINERfunctions (flow conversions, partner device groups, partner webhooks, network isolation, metric rollup compaction) all pinsearch_path.2027-01-18-188000-contract-documents-template-name-snapshot.sqldisables and re-enables a trigger around its update, which needs table ownership; the migration role owns the table on a standard install. - Rollback. Take a backup, or note a PITR point, before you upgrade. A rollback to v0.125.0 keeps the new schema, including the enum values above, and was not tested.
Environment variables.
- Required: none. No new required environment variables.
- New, optional (api service), mapped in both shipped Compose files:
INTERNAL_SERVICE_CIDRS(Compose default: yourBREEZE_DOCKER_SUBNET) andINTERNAL_API_HOSTS(api:3001). WithFORCE_HTTPS=true, portal and web server-side rendering calls to the API no longer get400 FORCE_HTTPS_NON_CANONICAL_HOST. Leave them unset on the bundled Compose. Every entry must lie wholly inside a private range, or the API refuses to boot; an emptyINTERNAL_SERVICE_CIDRSturns the exemption off. Custom Compose or Kubernetes installs set it to their pod or service network (#10681).NETWORK_ISOLATION_ENABLED(false) andNETWORK_ISOLATION_ENABLED_PARTNER_IDS(empty). Leave both unset. Network isolation is not available yet (#10088).TICKET_IMPORT_MAX_BYTES_PER_HOUR(2147483648, that is 2 GiB, never below 10 MiB): attachment bytes one ticket-import window may download per hour. A value that is not a plain positive integer logs a boot warning and the default applies (#10064).
- New, optional (api service), not in Compose (add them to the
apiservice'senvironment:block if you need to change one) (#10864):ALERT_WORKER_CONCURRENCY(a quarter ofDB_POOL_MAX, or half withBREEZE_ROLE=worker; it was a fixed 10). Raise it if the API logs that alert jobs are still pending.ALERT_WORKER_STAGGER_WINDOW_MS(50000, clamped to 0–59000). How far each minute's device evaluations are spread;0restores the old enqueue-all-at-once behaviour.AGENT_CONNECTIONS_MAX_PER_DEVICE(2000, up to 10000). Network connections stored per device report;10000stores everything, as before.
- Newly mapped in Compose: the IOC sweep limits
SECURITY_SWEEP_MAX_DEVICES,SECURITY_SWEEP_MAX_ACTIVE_PER_ORG,SECURITY_SWEEP_PUMP_INTERVAL_MS,SECURITY_SWEEP_PUMP_BATCH,SECURITY_SWEEP_PARTNER_RUNNING_CAP,SECURITY_SWEEP_TTL_HOURS_DEFAULT,SECURITY_SWEEP_MFA_DEVICE_THRESHOLD,SECURITY_SWEEP_RUNNING_GRACE_MINUTESandIOC_HUNT_FOUR_EYES_DEVICE_THRESHOLD. Defaults are unchanged and listed in.env.example(#10795). - Changed default:
FLOWS_ENABLED(true, wasfalse). See below.
Behaviour changes and feature flags.
- Flows on by default (#10700).
- Flows turns on after the upgrade if
FLOWS_ENABLEDreaches the API unset: that is, you take the v0.126.0 Compose file (which passes${FLOWS_ENABLED:-true}) or run a Compose file from before v0.125.0, and your.envhas noFLOWS_ENABLEDline. - Flows stays off if your
.envhasFLOWS_ENABLED=false(the v0.125.0.env.exampleline), or if you keep the v0.125.0 Compose file, which passesfalsewhen the variable is unset. - With Flows on: New job opens Flows,
POST /api/v1/automationsanswers410, and the Jobs page shows Move to Flows. Nothing is switched automatically. Managed Jobs (AI triage, monitor compile, policy workflows) are unaffected. - With
FLOWS_ENABLED=false: every flow route answers 404, Jobs stay fully writable, and Move to Flows does not appear. - Event-triggered Jobs can be moved only with durable event dispatch:
EVENT_DISPATCH_MODE=enforceandflow-event-triggeramongEVENT_DISPATCH_QUEUE_SUBSCRIBERS(keep the subscribers you already list). Otherwise they show Can't move yet. - A Job's webhook URL keeps working after the switch. The flow accepts JSON-object bodies only, and senders using the plain-secret header must move to
X-Breeze-Webhook-Token.
- Flows turns on after the upgrade if
- DNS Security stores blocked and redirected queries only (#10707). This applies to every existing integration. Turn on DNS Security → Integrations → Stored data → Store allowed traffic to keep allowed queries. Overview and
GET /dns-security/statssay Not stored (allowedTraffic: "none") instead of showing zero. Cisco Umbrella integrations also stop downloading allowed records. - Webhook retries (#10594). Failed deliveries retry for about 21 hours, then end
failed. The Redis dead-letter queue and per-webhookretry_policyare retired; pending entries are re-driven at upgrade. A webhook's connection-health incident now opens when a delivery fails for good, about 21 hours after the first failure for a dead endpoint, rather than within minutes. Editing or disabling a webhook stops its scheduled retries. - New webhooks default to alert payload v2, including those created through the API without
payloadVersion. Existing webhooks stay on v1 (#10576). - Discovery links by MAC only (#10323). An IP-only match no longer links a discovered asset to a device. Existing automatic links whose MAC is not on the linked device are dropped on the asset's next scan, and a device role that link set is reset so the agent's heartbeat restores it. Manual links are untouched.
- Alerts auto-resolve when acknowledged or suppressed and their condition clears (#10769). Alerts that require a person never do. Closed alerts do not re-open on events they already alerted on.
- Remote desktop idle timeout is 30 minutes (was 5) on devices with no Remote Access policy and under policies that do not set one. A timeout a policy sets explicitly, including a stored 5, is unchanged (#10797).
- Alert worker concurrency now follows
DB_POOL_MAXinstead of a fixed 10, and device evaluations are spread across each minute (#10864). - Agent connection inventory keeps up to 2,000 connections per device report (#10864).
- On-device dialogs are opt-in (#10190).
PROMPT_HOST_ENABLED_KINDS(already mapped in Compose) enables nothing when unset. The kinds arenotice.info,restart.prompt,restart.final,remote.consent,remote.sessionandelevation.request. Enable a kind only after this release's Breeze Assist build is published; the remote kinds need Breeze Assist 0.1.3 andelevation.requestneeds 0.1.4. - Network isolation is not available yet (#10088). Its migrations run, but nothing activates on upgrade:
NETWORK_ISOLATION_ENABLEDdefaults tofalse, the agent version gate is the999.0.0placeholder, and the Windows agent pieces ship switched off. The device page's start action stays disabled. - Wisp stays Breeze Cloud only (
BREEZE_WISP_ENABLED, defaultfalse). - Event-log collection (Windows): the first pass after the agent upgrade starts 15 minutes before the agent started; older events are not back-filled. Linux and macOS events collected around the agent upgrade can appear twice, once with the old id and once with the new one (#10702, #10779).
Agents. Agents, Breeze Assist and Breeze Viewer update to 0.126.0 through your normal update channel.
Agent-side changes in 0.126.0:
- Windows event-log bookmarks, Security audit events, PowerChute and policy-listed providers (#10702, #10566, #10720);
- unique Linux and macOS event ids (#10779);
- PAM: declined elevations never applied, outcome notices, UAC prompt dismissal (#10420, #10395, #10786, #10369, #10825);
- BitLocker probe gating, physical-disk health split,
seceditpassword policy, winget retry (#10906, #10776, #10473, #10465); - macOS helper reload after update, YARA engine signing, locked-display wake, VideoToolbox warm-up, per-user state directory (#10873, #10881, #10876, #10882, #10872);
- helper IPC resume, Assist crash-loop reporting, upgrade back-off (#10775, #10806, #10687);
- sensitive-data scans of user profiles (#10461) and a backup S3 key prefix (#10815);
- the on-device dialog cards, dormant until their kinds are enabled (#10190), and the legacy Windows restart box defaulting to Postpone (#10350);
- network isolation components, built switched off (#10916, #10858, #10826).
Known gaps in this release
- Live-agent checks not run before this release (the lab hardware was offline). These changes passed unit and build tests only:
- macOS upgrade in place: verified on Intel (macOS 15.8.1). The agent auto-updated from 0.125.0 with no permission prompt, the desktop helper came back within seconds, the existing Screen Recording grant was kept, and a YARA scan ran on the signed build (#10881, #10375). A remote session showed video, pointer and typed keys correctly. Not verified on Apple Silicon: the lab MacBook Air runs the hosted agent, which cannot be pointed at a test server.
- ConnectWise Manage alert tickets were tested against a stub, not a live ConnectWise Manage tenant (#10830, #10861).
- Vendor integrations without a live account in testing: NinjaOne SaaS Backup (Dropsuite), Pax8 orders, Emsisoft, UniFi Site Manager and the Microsoft 365 mailbox poll.
Known issues
- Cmd can stay held on a Mac after a shortcut in a remote session (#9595). After the Viewer sends a shortcut such as Cmd+S, the Mac can keep Cmd pressed until the next key is typed, so a click acts as a Cmd-click. Press and release Cmd in the session to clear it. This is not new in this release; a fix is in review.
- Some alert notifications can be skipped (#10926). In-app notifications, channel sends and escalations for rule-based, monitor and some job-generated alerts may not be sent. This predates this release (it is also in v0.125.0), and a fix is in progress.
What's Changed
- feat(api): one MSP identity resolver for device prompts, with a validated logo route (#10190) by @ToddHebebrand in #10314
- feat(flows): Tool Catalog W05 PR D — webhook panel, usage and limits, W5 step rendering (#5220) by @ToddHebebrand in #10313
- feat(assist): MSP identity header and localized chrome (#10190) by @ToddHebebrand in #10310
- feat(ai-tools): W12 — software catalog, deployment and device-software tools in chat and agents (#6754) by @ToddHebebrand in #10319
- docs(plan): tool catalog W6 — legacy automations conversion and worker retirement (#5215) by @ToddHebebrand in #10328
- docs(release-notes): clear the next-release draft after v0.125.0 by @ToddHebebrand in #10338
- feat(api): caller-verify logo bytes path and generic sender fallback (#10190) by @ToddHebebrand in #10340
- docs: sync technical docs for v0.125.0 by @ToddHebebrand in #10337
- feat(agent): safe-mode, permission and session-ended notices on the prompt host (#10190) by @ToddHebebrand in #10341
- feat(ai-tools): W13 — device inventory and ops tools in chat and agents (#6754) by @ToddHebebrand in #10343
- feat(assist): notice cards and one notification list for messages and prompts (#10190) by @ToddHebebrand in #10339
- feat(flows): Tool Catalog W06 PR A — conversion ledger, fleet built-in and lane, converter (#5221) by @ToddHebebrand in #10344
- feat(api,web): audit restart decisions and preview the restart card (#10190 W05 5C) by @ToddHebebrand in #10349
- feat(assist): restart prompt and closing cards (#10190 W05 5B) by @ToddHebebrand in #10347
- feat(agent): branded restart prompt with Postpone as the default and sessions in step (#10190 W05 5A) by @ToddHebebrand in #10350
- feat(api): allow_user_end_session on remote access policy, default on (#10190) by @ToddHebebrand in #10355
- feat(web): let MSPs choose whether users can end a remote session (#10190) by @ToddHebebrand in #10354
- feat(ai-tools): W13 PR B — live event-log browse, tenant variables and Quick Support sessions in chat and agents (#6754) by @ToddHebebrand in #10352
- feat(agent): remote consent and a clickable session indicator on the prompt host (#10190) by @ToddHebebrand in #10351
- feat(assist): remote consent card and session pill (#10190) by @ToddHebebrand in #10348
- fix(agent/pam): close the user's UAC prompt by window after an approved elevation (#10177) by @ToddHebebrand in #10369
- feat(web): partner settings inheritance drill-down, Known Guests partner tab, rail group (#9790) by @ToddHebebrand in #10363
- feat(pam): server side of the end user's withdraw — 'withdrawn' status and agent route (#8971, PR A) by @ToddHebebrand in #10374
- feat(ai-tools): W14 — billing lifecycle tools in chat and agents (#6754) by @ToddHebebrand in #10373
- fix(agent): never apply a PAM elevation the user declined; withdraw it on the server (#8971, PR B) by @ToddHebebrand in #10420
- feat(pam): end-user outcome notices for elevation requests handed to IT — PR 1 (#8928) by @ToddHebebrand in #10395
- feat(portal): expose physicalPlacement on network assets behind enablePhysicalPlacement (CPEV-W1) by @fabicarvano in #10176
- test(agent): make trusted-chain repair test umask-independent by @Bbomby in #10345
- fix(api): canonicalise uuid ids in every step-up resource digest by @Bbomby in #10342
- chore(deps): bump the aws-sdk group in /agent with 5 updates by @dependabot[bot] in #10331
- chore(deps): bump the go-minor-patch group in /agent with 4 updates by @dependabot[bot] in #10332
- fix(compose): bind the dev stacks to loopback and give legacy Redis a password by @Bbomby in #10346
- chore(deps): bump docker/login-action from 4.6.0 to 4.7.0 in the github-actions group by @dependabot[bot] in #10468
- feat(api): ticket import W1 — attachments in import mode (#8313) by @lennonflima in #10064
- ci(security): unblock Trivy — go-jose 4.1.6 (CVE-2026-116587) + pip-vendored msgpack CVE-2026-114613 ignore by @ToddHebebrand in #10510
- feat(agent): collect APCPBEAgent Warning/Information Application events (allowlist fast path) by @ToddHebebrand in #10566
- fix(unifi): page through Site Manager hosts and sites and keep network-server hosts by @ToddHebebrand in #10570
- fix(groups): re-evaluate software-keyed dynamic groups on inventory change and org move (W0 of #10521) by @ToddHebebrand in #10569
- fix(tickets): bound Graph time in the Microsoft 365 mailbox poll pass and log which limit stopped it (#8308) by @bdunncompany in #9445
- feat(webhooks): alert payload v2 with per-webhook payload_version; alert.escalated guard; docs (W1-A of #10528) by @ToddHebebrand in #10576
- fix(web): keep Add dropdown above sidebar by @JonathanPitre in #10318
- feat(api): ticket merge — a moved external ref records its origin ticket (#10120) by @lennonflima in #10287
- fix(auth): clear MFA method when profile disables MFA by @JonathanPitre in #10436
- fix(huntress): verify Standard Webhooks (Svix) deliveries and ack Send Test (#10335) by @ToddHebebrand in #10590
- fix(caddy): redact the Standard Webhooks Webhook-Signature header in access logs by @ToddHebebrand in #10602
- feat(groups): partner-owned device group schema, membership integrity trigger, RLS and registrations (W1 of #10521, dark) by @ToddHebebrand in #10603
- fix(security): ignore zip CVE-2026-115905 in the viewer lockfile until tauri-plugin-updater moves to zip 9 by @ToddHebebrand in #10618
- feat(webhooks): durable retries over ~21 h tracked in Postgres; retire the Redis dead-letter path (W1-B of #10528) by @ToddHebebrand in #10594
- feat(groups): nullable orgId, partner-aware group joins and write refusals (W2a of #10521, dark) by @ToddHebebrand in #10639
- feat(partner-api): alerts:write scope to acknowledge and resolve alerts with principal attribution (W1b-A of #10528) by @ToddHebebrand in #10596
- feat(webhooks): partner-owned webhooks with partner fan-out, delivery org_id, RLS and registrations (W1-C of #10528) by @ToddHebebrand in #10670
- feat(groups): partner-group evaluation engine with revisioned per-org job, 6 h sweep and benchmark (W2b of #10521, dark) by @ToddHebebrand in #10672
- feat(flows): Tool Catalog W06 PR B — conversion switch, occurrence claims, webhook forwarding (#5221) by @ToddHebebrand in #10685
- feat(web): show withdrawn PAM requests and user declines (#8971, PR C) by @ToddHebebrand in #10689
- feat(groups): partner-owned group create/edit/delete/assign API, org-user read view, AI tools (W3 of #10521) by @ToddHebebrand in #10690
- feat(partner-api): alert external ticket refs, alertId on ticket create, org external links in export (W1b-B of #10528) by @ToddHebebrand in #10673
- feat(pam): user_cancelled withdraw reason, renderer audit and technician name for elevation outcomes (W07 7A, #10221) by @ToddHebebrand in #10693
- feat(agent): stateful elevation request — first question, waiting, outcomes on Assist (W07 7B, #10221) by @ToddHebebrand in #10694
- feat(assist): elevation request cards — waiting, approved, denied, expired, failed, cancelled (W07 7C, #10221) by @ToddHebebrand in #10691
- fix(api): validate event-log uploads per row so one empty message no longer drops the whole batch (#10494, API half) by @ToddHebebrand in #10698
- feat(web): Tool Catalog W06 PR C — move Jobs to Flows (#5221) by @ToddHebebrand in #10700
- docs(spec): Dropsuite / NinjaOne SaaS Backup backup provider (draft) by @ToddHebebrand in #10597
- fix(org-merge): take partner-group row locks before export locks to avoid a deadlock with partner-group delete (#10692) by @ToddHebebrand in #10701
- chore(deps): bump the tauri group in /apps/helper/src-tauri with 2 updates by @dependabot[bot] in #10674
- chore(deps): bump base64 from 0.22.1 to 0.23.1 in /apps/helper/src-tauri by @dependabot[bot] in #10676
- chore(deps): bump tokio from 1.53.3 to 1.54.1 in /apps/helper/src-tauri by @dependabot[bot] in #10678
- fix(agent): event-log bookmarks, Security audit-event collection, empty-message fallback (#10495, #10496, #10494 agent half) by @ToddHebebrand in #10702
- feat(backup): Dropsuite / NinjaOne SaaS Backup provider adapter (W01) by @ToddHebebrand in #10703
- feat(groups): software version and vendor predicates in dynamic group rules (#10539) by @ToddHebebrand in #10704
- feat(backup): SaaS backup rows across UI, portal, alerts and reports + Dropsuite connection form (W02) by @ToddHebebrand in #10708
- feat(ai-tools): W14 PR B — generate_invoice + manage_accounting_sync, four-eyes with pinned effects (#6754) by @ToddHebebrand in #10709
- feat(groups): partner-wide device groups UI, pickers, org-user view and docs (W4 of #10521) by @ToddHebebrand in #10706
- feat(event-logs): policy-configurable Application providers for Warning/Information collection (#10493) by @ToddHebebrand in #10720
- docs(spec): org-subject alerts — alerts that are not about a device by @ToddHebebrand in #10722
- chore(deps): bump tokio from 1.53.3 to 1.54.1 in /apps/viewer/src-tauri by @dependabot[bot] in #10677
- docs(release): macOS upgrade-in-place gate before tagging by @ToddHebebrand in #10299
- fix(ai-gateway): trace OpenAI-compatible upstream failures server-side (#10591) by @ToddHebebrand in #10645
- fix(web): device overview — header actions flow, even stat grid, dedupe offline state, breadcrumb as Back by @ToddHebebrand in #10317
- fix(network): false stale supplies, fractional page counts, one timestamp per fact by @ToddHebebrand in #10324
- fix(security): resolve IOC sweep scans from websocket results and final command failures (#10376) by @ToddHebebrand in #10435
- fix(ai): compaction re-issues nextCursor at the last kept row so dropped rows stay pageable (#10385) by @ToddHebebrand in #10437
- fix(ai): run a reviewed proposal whose device is outside the session org (#10384) by @ToddHebebrand in #10438
- fix(portal): show the org's welcome message on the landing and sign-in pages (#9675) by @ToddHebebrand in #10439
- fix(agent): protocol-2 peripheral sync reports the scan it enforced (#9618) by @ToddHebebrand in #10440
- fix(portal): apply the partner's Custom CSS to every child org's portal (#9674) by @ToddHebebrand in #10441
- fix(agent/peripheral): v2 rollback restores per-device blocks (#10442) by @ToddHebebrand in #10443
- fix(security): Antivirus page tiles count real-time protection, not posture risk (#10378) by @ToddHebebrand in #10444
- fix(warranty): run each fleet-sweep subject in its own transaction (#10403) by @ToddHebebrand in #10445
- fix(api/scripts): a cancelled running script ends cancelled/confirmed, not failed/unconfirmed (#10377) by @ToddHebebrand in #10446
- fix(alerts): grade warranty-expiry alerts as lifecycle notices, not critical (#10371) by @ToddHebebrand in #10447
- feat(ai): record page context — ticket, quote, invoice, contract, org and site pages tell the chat what they show (#10364 W03) by @ToddHebebrand in #10449
- fix(ai-tools): Huntress status open-only severity, lean incident rows, get_huntress_agents (#10393) by @ToddHebebrand in #10450
- fix(ai): say a script proposal has not run, and give the model the reviewer's verdict (#10399) by @ToddHebebrand in #10454
- fix(warranty): Refresh keeps imported warranty data when no vendor lookup exists; label sources (#9862) by @ToddHebebrand in #10456
- fix(wisp): name the org in the assessment prompt and refuse a wrong org subject at call time (#10387) by @ToddHebebrand in #10457
- fix(quotes): edit "Valid until" and intro notes in the quote editor (#9859) by @ToddHebebrand in #10458
- fix(agent/sensitive-data): scan user profiles by default, never follow links, fail a scan that read nothing (#10380) by @ToddHebebrand in #10461
- fix(wisp): a first look reads the org's open alerts and runs as onboarding (#10389) by @ToddHebebrand in #10462
- fix(patching): never dispatch per-user (scope='user') winget patches (#10249) by @ToddHebebrand in #10464
- fix(ai-tools): state the fixed maintenance-window day, document rebootIfPending, return the resolved schedule (#10397) by @ToddHebebrand in #10466
- fix(wisp): bookkeeping writes on the grantor's own state skip the per_step card (#10392) by @ToddHebebrand in #10470
- fix(patching): stop the device install poll on the install outcome; rescan after 5 s off macOS (#10250) by @ToddHebebrand in #10471
- fix(backup): show skipped reparse points as info, not in the error log (#9543) by @ToddHebebrand in #10472
- fix(agent): read the Windows password policy with secedit, not Win32_AccountPolicy (#9597) by @ToddHebebrand in #10473
- fix(ai): run the chat message rate limit between DB phases, not inside one (#10415) by @ToddHebebrand in #10475
- fix(web): finish the Approve / Deny vocabulary on AI approval surfaces (#10198) by @ToddHebebrand in #10476
- fix(mcp): run below-Tier-3 actions on Tier-3 tools instead of filing a refused intent (#10027) by @ToddHebebrand in #10477
- fix(api): slot hourly security-posture compute-org jobs on the wall clock (#10478) by @ToddHebebrand in #10479
- fix(web): make command palette quick actions searchable (#10196) by @ToddHebebrand in #10480
- fix(web): acronym-aware AI tool names on /ai-risk, no retired "Operator" noun (#10197) by @ToddHebebrand in #10481
- fix(web/wisp): name a system pause beside Resume; no budget raise at the plan ceiling (#10106) by @ToddHebebrand in #10485
- fix(web/wisp): re-entering a live grant no longer asks for an unchecked code (#10105) by @ToddHebebrand in #10490
- fix(web): DNS security Integrations tab refreshes a "Deleting…" row until the background delete finishes (#10085) by @ToddHebebrand in #10502
- fix(web): say why each device was not moved in the bulk site-move toast (#10082) by @ToddHebebrand in #10503
- fix(web): invite user dialog no longer preselects the first role (#10074) by @ToddHebebrand in #10504
- fix(web): IOC sweep dialog plurals, visible Sweep-now reason, explicit over-limit errors (#10080) by @ToddHebebrand in #10505
- fix(offboarding): refuse the person leaving as their own mail inheritor (#10076) by @ToddHebebrand in #10506
- fix(web): make a merged ticket's time, billing and parts rail read-only (#10073) by @ToddHebebrand in #10507
- fix(web): don't pre-fill the ticket requester as the person leaving (#10075) by @ToddHebebrand in #10509
- fix(agent): consume the helper's reply to remote-session and legacy notices (#10224) by @ToddHebebrand in #10511
- fix(flows): park a Tier-3 external flow step on a bound intent (#10288) by @ToddHebebrand in #10514
- fix(software-compliance): gate derived service watches and bridge violations on managed applicability (#10126) by @ToddHebebrand in #10516
- fix(security): budget-derived scan command timeout; finalize orphaned non-sweep scans (#10057) by @ToddHebebrand in #10517
- fix(dns-security): record a truncated Umbrella window as 'truncated', not success (#10047) by @ToddHebebrand in #10518
- fix(settings): org Branding primary colour reaches quotes and invoices (#9962) by @ToddHebebrand in #10543
- fix(deliverables): a ticketless missed occurrence rescheduled goes back to scheduled (#9959) by @ToddHebebrand in #10564
- fix(reports): Excel export is a real .xlsx workbook, not TSV saved as .xls (#9956) by @ToddHebebrand in #10568
- fix(web): translate every built-in email template name (#9953) by @ToddHebebrand in #10572
- fix(web/settings): success toasts on user remove, webhook delete, key revoke; known-guest confirm; key expiry column (#9950) by @ToddHebebrand in #10574
- fix(web): staff Customer view renders tile labels, not raw DTO keys (#9952) by @ToddHebebrand in #10575
- fix(web): SSO preset switch replaces the whole attribute mapping (#9948) by @ToddHebebrand in #10578
- fix(web): PSA form stops posting hidden sync settings; ticket card titled "PSA Tickets" (#9947) by @ToddHebebrand in #10579
- fix(settings): org defaults save writes only changed fields; add reset to default (#9945) by @ToddHebebrand in #10582
- test(web): PeripheralPolicyForm expiry tests are timezone-robust (#9943) by @ToddHebebrand in #10583
- fix(analytics): apply the custom range explicitly; show a single enrollment week (#9942) by @ToddHebebrand in #10586
- fix(audit): filter panel reopens with the applied filters; no empty BEFORE/AFTER blocks (#9941) by @ToddHebebrand in #10587
- fix(analytics): SLA tab empty state with a create form, exclusions on the card (#9940) by @ToddHebebrand in #10588
- fix(flows): label unresolved step tools 'Unknown tool' and show step defaults (#9937) by @ToddHebebrand in #10593
- fix(scripts): badge script source in Run Script picker and device Scripts tab (#9935) by @ToddHebebrand in #10604
- fix(scripts): scope Execute modal pickers to the script's org; honest offline confirm copy (#9934) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10605
- fix(security): carry custom paths into "Sweep again with the current rules" (#10079) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10606
- fix(web): Cove credential labels match the help text — API user login name / token (#9932) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10607
- fix(backup): one byte formatter for every backup surface (#9931) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10608
- fix(web): IOC sweep progress names cancelled/failed/expired devices, shows running (#10078) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10610
- fix(web): CIS Remediations status filter and badges share one label set (#9929) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10611
- fix(web): Sensitive Data risk order, translated labels, labelled icon buttons (#9928) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10613
- fix(patching): ring patch list returns externalId/version and resolves severity for an empty ring (#9930) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10614
- fix(web): load permissions when a signed-in session has none (#9927) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10615
- fix(contracts): show deliverables and the Paused note in the draft editor (#9958) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10616
- fix(web): filter chip preview shows a hint until a value is picked (#9857) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10617
- fix(quotes): show resolved agreement values and name unlabeled outline entries (#9867) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10620
- fix(wisp): readiness and get_backup_status agree on vendor backups (#10404) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10623
- fix(agent): log feature-update policy at INFO only when the outcome changes (#10382) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10624
- fix(test): make quote_win_rate leak checks UUID-proof (#10353) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10627
- fix(api): reject invite scope restrictions the scope cannot honour (#10315) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10628
- fix(agent): fail fast when screen capture returns no frame (#10304) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10630
- fix(software): show the vendor's reason beside a failed install's exit code (#10307) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10631
- fix(api): invoice email + public view read online-payment availability on the caller's connection (#9585) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10633
- fix(api): org list serves accessible org names without organizations:read (#9528) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10634
- fix(ai): reflect an approval decided elsewhere in the chat card (#9431) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10638
- fix(api): let the portal frame its own agreement PDF (#10290) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10642
- fix(remote): Quick Support copy link is an absolute URL (#10508) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10643
- fix(viewer): hold the input focus ring until the remote screen has a frame (#10424) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10644
- fix(yara): build breeze-yarac into the dev API image and show "compiler unavailable" instead of "Has errors" (#10306) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10649
- fix(contracts): validate manual line quantity inline with the shared grammar (#10293) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10653
- fix(wisp): readiness concern names the Triage agent and fires when it is off (#10292) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10656
- fix(web/wisp): side panel and /ai/chat speak one voice under a Wisp grant and follow it when it ends (#10195) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10658
- fix(ai): a refused send drops its bubble and restores the draft; label the monthly message count (#10108) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10659
- fix(wisp): no-grant reads answer 200 null; hide Wisp nav for non-partner tokens and viewer rail links (#10200) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10660
- fix(web): site CRUD success toasts + unique site row-action testids (#10084) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10661
- fix(web): header org switch keeps the Patches and Sensitive Data tab and filter (#10083) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10663
- fix(wisp): a paused grant's thread still reads its concerns and activity (#10104) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10664
- fix(migrations): naming guard judges only branch-authored migrations, fails on renamed shipped ones (#10015) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10666
- fix(dev): key wt-stack's compose project on the worktree; down fails loudly (#9864) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10669
- fix(ai-operator): a stopping task never advances and always settles (#9979, #9980) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10680
- fix(web): Integrations org switch keeps the tab; org header refreshes after a contact change (#9954) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10567
- fix(patching): confirm by name before deleting an update ring with no linked policies (#8909) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10683
- fix(billing): refuse issuing block-held time; live block usage skips time a draft can bill hourly (#8970) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10684
- fix(portal): accepted public quote link keeps a payment step (#3740) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10688
- docs(gh-queue): never review draft PRs by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10699
- fix(backup): Dropsuite plain-language connection errors + provider-specific name placeholder by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10721
- fix(dns-security): store blocked and redirected DNS events only, allowed traffic opt-in (#10054) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10707
- fix(agreements): record-signed says to attach the signed copy when a template needs a quote (#9296) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10682
- fix(settings): gate the sending-domains probe on /config and stop partner-settings reloads (#9949) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10580
- fix(web): org agent-version pin Inherit removes the org key instead of saving 'latest' (#10584) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10585
- fix(portal): format agreement dates in the org zone on every surface (#10291) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10655
- fix(workloads): report image provenance; never look up unknown-provenance images (#9067) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10719
- fix(deps): node-forge 1.4.2 for GHSA-86w9-cpqp-85rv; remove the audit exception by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10770
- fix(web): route Devices "New group…" to the Device Groups create flow (#9865) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10455
- fix(agent): retry winget 0x8A15002B as an unscoped upgrade before reporting already_current (#10248) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10465
- fix(ai-tools): list configuration-policy maintenance windows in manage_maintenance_windows (#10409) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10460
- fix(patching): deleting or disabling an update ring cancels its undispatched patch work (#8909) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10710
- fix(peripheral): stop sweeping inactive and trust-denied tenants (#10362) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10625
- fix(software): refuse Inventory approve/deny into a policy that governs no device; show coverage (#9635) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10713
- fix(ai-tools): manage_patches scan queues a real patch_scan command (#10383) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10433
- fix(agent): back off an upgrade target whose artifact fails verification (#7516) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10687
- fix(ai-tools): search_documentation returns the matching section text (#10398) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10451
- test(api): complete every effectProbes mock + guard against partial ones (#10174) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10657
- fix(api): let in-cluster SSR calls through FORCE_HTTPS by socket peer, not Host (#9700) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10681
- fix(ui): devices, sites, topology and portal lifecycle papercuts (#9868) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10619
- fix(quotes): refuse to send or accept a quote with no line items (#9963) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10467
- fix(edr): count Huntress/SentinelOne integrations as EDR coverage in get_edr_status (#10394) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10448
- fix(web/settings): select the user named by /settings/users# (#10111) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10501
- fix(agreements): reopening a signed agreement link shows the signed state, not "invalid" (#10199) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10515
- fix(web): hide Require-MFA banner and skip dashboard 403s for read-only partner roles (#10295) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10647
- fix(web/wisp): offer the picker's Users tab only to callers who can list and link users (#10113) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10482
- fix(web): dock the AI and Help side panels below the app header (#10107) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10483
- fix(portal): readable posture CSV headers; trust embed date follows page locale (#9964) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10519
- fix(webhooks): count failed deliveries, not retry attempts (#9946) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10581
- fix(oauth): branded error page for refused clients instead of oidc-provider's 'oops' page (#9938) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10595
- fix(billing): quote cover matches PDF; timesheet rate once; reports text (#9957) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10571
- docs: remove MinIO from dev quickstart services list by @sr1k3sh in https://github.com/LanternOps/breeze/pull/10737
- test(api): bind dcr-redirect-policy server to an OS-assigned port by @sr1k3sh in https://github.com/LanternOps/breeze/pull/10738
- fix(api): honour the org switcher's orgId on the operator-task list (#10112) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10488
- fix(devices): re-sync the devices list when the user returns to the tab (#9936) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10592
- fix(security): route manual Scan now through the dispatch caps, with cancel, expiry and live caller re-check (#10057 gap 2) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10714
- fix(web): partner security limits validate against the server's bounds (#10081) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10512
- fix(wisp): give event-triggered assessments the alert id, not the bus event id (#10388) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10452
- fix(wisp): refuse launch_specialist for a switched-off agent before the approval card (#10193) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10486
- docs(spec+plan): alert re-arm lifecycle — anchored episodes + partner/org re-arm defaults (#10538) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10730
- docs(agents): generate AGENTS.md from CLAUDE.md by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10760
- fix(security): ignore zip CVE-2026-115909 in the viewer lockfile until tauri-plugin-updater moves to zip 9 by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10741
- docs: CI throughput design + W01 plan (#10744) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10752
- fix(api): legacy contact role adapter applies deltas and re-scopes roles on re-pin by @fabicarvano in https://github.com/LanternOps/breeze/pull/10246
- feat(portal): show physical placement in network assets table (CPEV-W1) by @fabicarvano in https://github.com/LanternOps/breeze/pull/10763
- fix(viewer): show why a desktop session ended and drop the dead Retry (#10421) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10637
- fix(agent): re-send a dropped session banner hide and sweep stale banners (#10316) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10629
- fix(agent): leave a partial admin target-release policy as-found (#10305) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10632
- fix(compliance): one failing device no longer freezes the whole compliance scan (#10401) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10648
- fix(ci): run db:check-drift against a migrated database; stop flagging present extension rows (#10357) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10646
- fix(security): Trends day points use each org's latest snapshot, not an hourly average (#9926) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10667
- fix(analytics): label Query Builder day buckets by calendar date (#10077) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10662
- fix(portal): name the merged-into request by its portal number, not the staff number (#10072) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10665
- docs: quote document theme location, partner branding on documents, HP_WARRANTY_ENABLED (#9861) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10679
- docs(plan): ai full control W15 — Pax8 tools (#6785) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10789
- feat(edr): Emsisoft cloud EMC read adapter + framework extension points (#8168) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10159
- fix(profile): refresh avatar updates and retain identity on logout (#10244, #10245) by @JonathanPitre in https://github.com/LanternOps/breeze/pull/10252
- fix(auth): delete a lost passkey with a recovery code (#10651, #10652) by @JonathanPitre in https://github.com/LanternOps/breeze/pull/10671
- ci: flake defense + cache hygiene (CI throughput W1) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10761
- fix(agent): place the PAM waiting card only after Send request is applied (#10734) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10782
- chore(security): drop the node-forge CVE-2026-85393 Trivy ignore by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10828
- feat(api): network-isolation W1a — episode table, tenancy registrations, shared contracts, break-glass, allowlist, state machine (#10089) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10785
- feat(psa): alert ticketing config + ConnectWise ticket capability (#10499) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10783
- feat(agent): network-isolation W1d — journal + lock, fuzzed state machine, resolver, probes, break-glass, fenced Manager (#10092) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10826
- feat(ai-tools): W15 Pax8 tools PR A — status, products, subscriptions and order drafts (#6785) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10827
- feat(wisp): working-set model — link sources, promotion, auto eviction, concern subjects (#10364 W01) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10434
- feat(alerts): alerts owned by something other than a device — foundation and guards (W1 of #10725) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10733
- fix(alerts): owner-kind review follow-ups — preserve resolves, expose skips, tighten the device CHECK (#10725 W1) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10835
- fix(alerts): publish alert.suppressed from every suppress path; add alert.escalated (#10573, #10565) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10788
- feat(wisp): auto-link on focal acts — subject manifest, onSuccess seam, relations, Viewing now (#10366) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10834
- fix(settings): partner TTL placeholders and pin caption agree with inheritance badges (#10372) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10807
- test(threat-detection): make evidence coverage-window test clock-independent by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10848
- fix(seed): documentation addresses for topology demo VPN interface (#9858) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10803
- docs(upgrades): drop stale 'no rule UI yet' from v0.124.0 YARA note (#10051) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10799
- docs(wisp): update W00 wave-map migration slots to shipped names (#10115) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10801
- test(e2e): missing data-testid hooks + stale vulnerabilities spec (#10040) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10802
- fix(billing): anchor the Checkout idempotency bucket to the invoice, not the wall-clock hour (#10736) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10778
- test(securefs): pin the non-empty-dir refusal with a sentinel error (#10723) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10781
- fix(web): render the ticket checklist read-only on a merged tombstone (#10025) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10794
- test(agent): stop timing real sleeps in Retry-After tests (#10742) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10774
- fix(deliverables): name the cited record on occurrence evidence chips (#9961) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10520
- fix(groups): leave decommissioned devices out of dynamic group preview and membership (#9933) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10609
- test: defuse date-anchored tests (DST cutover shard 15 + sweep) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10854
- fix(ai-guardrails): auto-execute manage_policy_feature_link list as a read (#10412) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10459
- fix(approvals): skip graduation prefetch while policy-decide is dark; fetch pending once on load (#9939) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10589
- docs(spec+plan): alert → PSA ticket — partner-wide webhooks, Partner API write-back, native ConnectWise Manage ticketing (#10528) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10772
- feat(quotes): Download PDF on the public proposal link (#9860) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10787
- fix(remote): raise the baseline desktop idle timeout from 5 to 30 min (#10422) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10797
- feat(ai): per-device script run history in get_script_execution_history (#10417) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10817
- feat(psa): alert → ConnectWise ticket intake, reconciler and leased worker (#10499) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10830
- chore(deps): bump the tauri group with 3 updates by @dependabot[bot] in https://github.com/LanternOps/breeze/pull/10260
- fix(web): drop the hard-coded no-silent-mutations file count (#10030) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10777
- fix(agent/pam): close the Breeze dialog and target the UAC prompt on a timeout deny (#10370) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10825
- fix(agents): withhold upgrade offers a local-mode server cannot serve (#7516) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10686
- fix(ai-operator): reserve each provider account per task, held through an unknown_effect handoff (#9981) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10715
- ci(selection): W03 PR selection fixes — install inputs as readers, path-read edges, protected floor, agent/** both ways (#10744) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10849
- fix(security): expose per-sweep rule_set_changed count; web stops inferring it (#10049) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10811
- fix(settings): derive effective-settings locked[] from the partner settings catalog (#9762) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10814
- fix(ai): query_devices and manage_alerts rows carry their organization for multi-org callers (#10408) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10784
- fix(ai-tools): manage_groups add_devices/remove_devices supervised with org/site scope guards (#10149) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10822
- feat(agreements): a reopened signed agreement link downloads its certified copy (#10695) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10798
- fix(security-agents): surface installer_missing coverage instead of pruning the SentinelOne rule (#9247) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10823
- feat(devices): warranty column and status filter on the device list (#9863) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10800
- fix(ai-tools): manage_tickets merge in the chat SDK shape; system_cleanup cancel (#10161) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10813
- feat(alerts): owner-aware notifications and web UI for alerts that are not about a device (#10725 W2) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10837
- feat(ai): get_partner_settings_inheritance read tool (#9763) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10820
- fix(prompts): refuse reserved brand names as the partner/org display name (#10325) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10818
- fix(reliability): server scoring windows + multi-source event-log links (#10053) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10816
- fix(backup): agent-side S3 tools honor the snapshot key prefix (#9441) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10815
- fix(tickets): system-authored notes are read-only; show template item portal visibility (#9960) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10563
- fix(agent): keep Windows disk inventory when reliability counters are slow (#10753) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10776
- fix(agent): unique per-entry event-log ids on Linux and macOS (#10731) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10779
- fix(flows): on-failure notice names the device's failure reason (#10705) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10791
- fix(web): offer ticket.merged in the webhook event picker (#10024) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10793
- feat(devices): bulk "Add to group" / "Remove from group" on the device list (#9866) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10805
- fix(deploy): map IOC sweep limits in compose and .env.example (#10050) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10795
- feat(patches): ring application rules can block or pin Linux packages (#9370) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10821
- fix(wisp): model menu on the home thread, roll the session at the turn limit, drop New conversation by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10419
- fix(ai): stop invented tool names in chat and render them neutrally (#9855) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10635
- fix(software): script fields and zip in the version manager; no args for pkg/dmg/deb/zip (#10037) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10812
- feat(signup): record signup intent, show billing's quote, drop the $999 launch default by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10732
- fix(agent): PAM outcome notices without Assist use the localized elevation catalog (#10696) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10786
- fix(discovery): auto-link discovered assets by MAC only; repair IP-only links on re-scan by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10323
- fix(agent/ipc): resume a frame across read-deadline timeouts in Recv (#10541) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10775
- feat(devices): export the filtered Devices list to CSV (#9726) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10780
- fix(topology): device deletion keeps site-owned alert history (#7269, #10725 W4) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10836
- test(api): stop the wispGrant ordinary-session test hanging when run alone by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10878
- feat(agent/isolation): Windows WFP binding, isolator and recovery scheduler (#10094) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10858
- feat(backup): SaaS backup failures raise alerts (#10728) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10856
- feat(psa): alert tickets card and alert-page ticket chip (#10537) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10861
- feat(wisp): working-set surface — pill strip, pin route, Talk to Wisp about this (#10368) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10833
- ci(queue): thin merge-queue selection in shadow mode + PR provenance records (#10748) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10867
- fix(billing): link quote-created draft contracts from the quote and the contracts list (#10361) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10790
- fix(ai): refused and failed tool calls keep their reason in the ledger; transcripts keep execute_command stdout (#10411) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10626
- fix(web): label every agent catalog tool and action in all 8 locales (#10194) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10484
- fix(ai-tools): agent-log and patch reads cover the caller's orgs, not accessibleOrgIds[0] (#10396) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10453
- docs(release): Step 0.25 on the lab Intel mini — assert helper loaded after pkg install, wallpaper restore, csreq match by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10871
- fix(agent/macos): wait out the helper bootout before bootstrap; revive an unloaded helper after update (#10868) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10873
- fix(wisp): readiness notes get their own concern subject; a signed upsert never adopts another concern (#10386) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10463
- fix(ai-models): no inert patch_test assignments; removeOffering ignores and drops them (#9496) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10636
- fix(ai): bill every modelUsage key of an agent-run hop query (#10413) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10622
- fix(agreements): customers see the template name, never the internal label; Send dialog expiry no longer jumps (#10294) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10654
- fix(software): org scope reads its partner's keyed built-in versions (#10036) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10668
- fix(agent): count Assist crashes until a 60 s healthy run (#10302) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10806
- fix(agent): macOS helper per-user state dir + root-staged OpenH264 (#10870) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10872
- fix(agent): macOS helper explains "TCC granted but preflight denied" (#10300) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10875
- fix(desktop): keep a locked Mac's display awake and name the asleep case (#10874) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10876
- fix(web): label audit target types in Recent Activity instead of raw tokens (#9856) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10621
- fix(agent): warm up VideoToolbox before restoring it; watchdog leaves capture alone on encoder stalls (#10880) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10882
- fix(agreements): certificate says "via signing link", versioned so signed certificates never change (#10513) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10711
- feat(ai-tools): W15 Pax8 PR B — four-eyes order submit with pinned digest, supervised reconcile, approved-baseline billing CAS (#6785) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10832
- feat(api): network-isolation W1b — heartbeat containment block, command registrations, ordered finalizer, service + routes (#10090) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10831
- feat(agent): network-isolation W1e agent wiring (#10093) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10857
- docs(release-notes): consolidated draft entries for in-flight PRs (2026-11-01) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10853
- feat: WAN/circuit on asset detail + WAN role toggle (W1-D2) by @fabicarvano in https://github.com/LanternOps/breeze/pull/10333
- docs(spec): CPEV-W2 network site health implementation spec by @fabicarvano in https://github.com/LanternOps/breeze/pull/10810
- fix(metrics): take rollup compaction locks with NOWAIT so maintenance cannot deadlock requests (#10829) by @bdunncompany in https://github.com/LanternOps/breeze/pull/10855
- fix(devices): re-evaluate warranty.status dynamic groups when a warranty write changes status by @sr1k3sh in https://github.com/LanternOps/breeze/pull/10877
- feat(api): add service catalog item configuration (#8325) by @fabicarvano in https://github.com/LanternOps/breeze/pull/10869
- feat(devices): network-isolation console, Isolated filter and docs (#10096) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10884
- test(agent): defuse the 2026-11-02 date bomb in the SNMP interface-poll envelope test by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10887
- test(helper): pin the clock in session_end_empties_the_notification_list by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10889
- test(agent): count attempts, not wall-clock, in elevation error tests (#10043) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10809
- fix(api): bound alert-worker pool use and chunk bulk ingest inserts (#10859) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10864
- feat(api): network-isolation W1c — server guards: bypass closure, lifecycle refusals, sweeper (#10091) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10886
- feat(remote): relay-only remote desktop while a device is network-isolated (#10097) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10883
- fix(dns-security): bounded, keyset-paged Events tab with a blocked-only partial index (#10054) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10469
- fix(agent): sign breeze-agent for the YARA engine's compiled code on macOS (#10375) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10881
- fix(monitors): strip legacy "[monitor] " prefix from converted managed network checks (#7358) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10640
- chore(deps): bump the tauri group across 1 directory with 4 updates by @dependabot[bot] in https://github.com/LanternOps/breeze/pull/10912
- fix(mcp): refuse an OAuth intent release after the requester's auth_epoch moves (#9758) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10819
- fix(agent): gate BitLocker probes on a cached availability check (#10902) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10906
- chore(deps): bump react-native-worklets from 0.13.0 to 0.13.1 in the react-native-animation group by @dependabot[bot] in https://github.com/LanternOps/breeze/pull/10891
- chore(deps): bump werift from 0.25.1 to 0.25.2 in /e2e-tests by @dependabot[bot] in https://github.com/LanternOps/breeze/pull/10894
- chore(deps): bump @types/node from 26.6.5 to 26.6.6 in /e2e-tests by @dependabot[bot] in https://github.com/LanternOps/breeze/pull/10893
- fix(alerts): fill {{description}} and {{conditionsMet}} on new monitor alerts by @bgatestmg in https://github.com/LanternOps/breeze/pull/10743
- feat(agent/isolation): Windows recovery, uninstall release and readiness, built inert (#10095) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10916
- feat(alerts): anchored alert episodes — evidence cursor + ack/suppressed auto-resolve (W1 of #10765) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10769
- chore(deps): combine eight dependabot bumps into one lockfile change by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10917
- feat(config-policy): containment policy feature, part 1 — type, schema, resolver (#10100) by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10915
- fix(web/psa): stop the alert ticket list crashing /integrations/psa by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10938
- fix(security): bump pypdf to 6.21.4 in the AI workspace image by @JonathanPitre in https://github.com/LanternOps/breeze/pull/10920
- fix(monitors): stop a partial PATCH resetting omitted settings to defaults by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10939
- fix: pre-release sweep v0.125.0 → main — six small fixes + sweep doc by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10940
- feat(web): What's New entry for v0.126.0 by @ToddHebebrand in https://github.com/LanternOps/breeze/pull/10943
New Contributors
- @sr1k3sh made their first contribution in https://github.com/LanternOps/breeze/pull/10737
Full Changelog: v0.125.0...v0.126.0