What's Changed
- docs(release-notes): clear next-release draft after v0.126.0 by @ToddHebebrand in #10950
- docs: sync technical docs for v0.126.0 by @ToddHebebrand in #10949
- fix(alerts): publish alert.triggered only after the alert row commits (#10926) by @ToddHebebrand in #10944
- fix(devices): send the hardware serial number in the device list (#10921) by @bdunncompany in #10945
- chore(release): keep compose files at v0.126.0 so v0.126.1 can ship server-only by @ToddHebebrand in #10955
- chore(release): list v0.126.1 as a server-only release on v0.126.0 by @ToddHebebrand in #10957
- feat(unifi): W3 Wi-Fi read model and Deep telemetry UI (#7690) by @fabicarvano in #10269
- feat(billing): gate billing routes and services on partners.billing_enabled (#8807) by @fabicarvano in #10282
- fix(profile): simplify picture selection and saving (#10330) by @JonathanPitre in #10334
- feat(agent): persist helper branding per session (Phase 2, Wave 2) by @fabicarvano in #10792
- feat(api): ticket import W4 — the import framework: sources, routes, lease, worker and ledger (#8313) by @lennonflima in #10890
- fix(agent): inject the printable typing block by scancode in Physical keys mode (#3920) by @ToddHebebrand in #10905
- test(api): anchor the partner-wide cutover schedule test on switch_at, not the wall clock (#10773) by @sr1k3sh in #10796
- fix(tool-sources): stop a partial PATCH resetting rateLimitPerMinute to 120 (#10932) by @sr1k3sh in #10956
- fix(api): script reviewer output cap + supervision-is-not-a-defect prompt by @ToddHebebrand in #10976
- feat(api): add service catalog management routes (#8325) by @fabicarvano in #10942
- fix(agent): skip the Security Center query on Windows Server (#10907) by @ToddHebebrand in #10969
- chore(deps): bump the go-minor-patch group in /agent with 3 updates by @dependabot[bot] in #10948
- fix(api): raise global per-IP rate limit default 300 → 600/min by @ToddHebebrand in #10963
- fix(web): keep the software policy tab open on create by @PJF16 in #10966
- fix(agent): treat macOS 'crontab -l' no-crontab exit as empty (#10910) by @ToddHebebrand in #10968
- chore(deps): combine three dependabot bumps into one lockfile change by @ToddHebebrand in #10979
- fix(api): scope DNS Security reads to the selected org (#10931) by @ToddHebebrand in #10981
- fix(agent): gate Defender status on a cached availability check (#10908) by @ToddHebebrand in #10970
- fix(tickets): connecting an M365 mailbox no longer imports its backlog (#10863) by @ToddHebebrand in #10983
- feat(agent/isolation): macOS pf network isolation, built inert (#10099) by @ToddHebebrand in #10990
- feat(api): AI release_containment tool, four-eyes, bound to the isolation episode (#10101) by @ToddHebebrand in #10984
- fix(agent): gate seven periodic probes on availability (#10911) by @ToddHebebrand in #10997
- fix(ci): remove half-installed Tauri packages before the apt network fallback by @ToddHebebrand in #11031
- feat(wisp): wisp_check_ins table, check_in post kind, tenancy registries (#10992) by @ToddHebebrand in #10999
- fix(web): Devices breadcrumb always goes to the devices list (#10959) by @ToddHebebrand in #11001
- fix(api): JWKS endpoint failures return 503, not 401 (#10936) by @ToddHebebrand in #11002
- fix(analytics): Performance Trend labels days on the right day west of UTC (#10937) by @ToddHebebrand in #11003
- test(api): bind oauth integration listeners to port 0 (#10879) by @ToddHebebrand in #11005
- fix(web): partner AI switch is a tri-state, not "budget enforcement" (#9666) by @ToddHebebrand in #11006
- fix(agent/helper): refuse non-regular per-session helper files (#10964) by @ToddHebebrand in #11007
- fix(settings): org Branding logo and colours reach the portal and documents (#9673) by @ToddHebebrand in #11009
- feat(agent/isolation): Linux nftables isolation, cgroup split and procspawn, built inert (#10098) by @ToddHebebrand in #10987
- fix(tickets): verify external M365 mail on Exchange's stamp and trusted ARC sealers (#10862) by @ToddHebebrand in #11000
- fix(api): close isolation fail-open and gate-parity gaps before activation (#10919) by @ToddHebebrand in #11008
- fix(ci): Tauri apt closure independent of the runner image (#9847) by @ToddHebebrand in #11015
- fix(backup): a queued job's unused write session survives its lapsed lease (#11012) by @ToddHebebrand in #11016
- fix(security): evaluate schedule-policies ticks on the wall clock, not the frozen scanAt (#10031) by @ToddHebebrand in #10474
- fix(agent/helper): keep Assist hidden when its version is unreadable (#10755) by @ToddHebebrand in #11029
- fix(portal): refuse login for an inactive org with a clear message (#10934) by @ToddHebebrand in #11032
- fix(ai): ToolSearch round-trips no longer spend the session turn budget (#10400) by @ToddHebebrand in #11033
- feat(devices): collect and show the system product number (#9593) by @ToddHebebrand in #11041
- fix(agent): latch a self-update that did not take effect; surface why (#9751) by @ToddHebebrand in #11047
- fix(api): correlated subqueries in single-table selects returned wrong data (#9692) by @ToddHebebrand in #11054
- fix(validators): pin agent byte budgets that zod 4.6 counts in code points (#9976) by @ToddHebebrand in #11059
- feat(agent/isolation): heartbeat policyRevision, scope:any acceptance, capability 3 (#11034) by @ToddHebebrand in #11050
- fix(scripts): clamp long reviewer summaries, retry an unparseable verdict once, and let a person override a failed AI review (#10954) by @ToddHebebrand in #10985
- chore(deps): bump jsdom to 30.1.3 and fix the threat-detection export test by @ToddHebebrand in #10986
- fix(api): retry a contended metric-rollup compaction instead of dropping it for the night (#10960) by @ToddHebebrand in #11037
- feat(wisp): check-in service, wake job and tick reconcile (#10993) by @ToddHebebrand in #11064
- feat(devices): record wake outcomes and refuse online targets (#10839) by @ToddHebebrand in #11048
- docs(plan): ai full control W17 backup tools and W18 org admin tools by @ToddHebebrand in #11053
- docs(plan): EDR W06 installer dispatch + security-agents hook (#8170) by @ToddHebebrand in #11056
- docs(plan): CI throughput W02 trust boundary plan by @ToddHebebrand in #11058
- feat(agent/isolation): self-host Windows recovery trust via signed-manifest hash (#11035) by @ToddHebebrand in #11049
- docs(plan): Wisp delegation (device troubleshooting specialist, thread post-back) and unattended reads by @ToddHebebrand in #11051
- docs(plan): OEM vendor updates (Dell, Surface, HP, Lenovo) by @ToddHebebrand in #11052
- fix(agent): read the Windows local admin SID and enabled state (#10998) by @ToddHebebrand in #11055
- fix(agent): read the nftables/iptables ruleset when ufw and firewalld can't answer (#10909) by @ToddHebebrand in #11046
- fix(test): stop the shard 8 flakes in streamingSessionManager and contract PDF suites (#11011) by @ToddHebebrand in #11092
- ci(policy): single policy manifest for selection inputs (#10746) by @ToddHebebrand in #11087
- feat(backup): run a missed scheduled backup when the device reconnects (#11013) by @ToddHebebrand in #11036
- feat(ai-tools): W17 — backup verification, VSS, C2C configs and recovery reads in chat and agents (#6754) by @ToddHebebrand in #11091
- fix(devices): scope patch history to the device's current organization by @ToddHebebrand in #11088
- fix(agent): resolve SIDs and enabled state on the net localgroup fallback (#11057) by @ToddHebebrand in #11100
- feat(wisp): schedule_check_in / list_check_ins / cancel_check_in tools (#10994) by @ToddHebebrand in #11096
- ci: run Rust Check when helper-read agent/internal/ipc files change (#11042) by @ToddHebebrand in #11099
- fix(psa): enqueue alert-ticket wakes after the request transaction (#10933) by @ToddHebebrand in #11102
- fix(mcp): stop advertising partner-wide AI tools MCP always refuses (#10930) by @ToddHebebrand in #11103
- test(agent/heartbeat): join Stop goroutines in pam-unable tests (#11062) by @ToddHebebrand in #11104
- feat(alerts): alert lifecycle defaults API — partner → org → monitor, snapshot, after_delay (#10767) by @ToddHebebrand in #10989
- feat(wisp): device-troubleshooting specialist, run-card step feed, real Workers panel (#11084) by @ToddHebebrand in #11093
- feat(edr): installer dispatch for EDR framework providers — GravityZone, dormant (#8170) by @ToddHebebrand in #11095
- feat(isolation): send containment-policy permits to level-3 agents, server side (#10100) by @ToddHebebrand in #11097
- feat(config-policy): Containment tab for extra isolated-device destinations (#10100) by @ToddHebebrand in #11098
- feat(web): alert lifecycle defaults card + monitor editor section (#10980) by @ToddHebebrand in #10982
- feat(wisp): prepend fired check-ins to the next chat turn (#10995) by @ToddHebebrand in #11105
- fix(backup): report resume checks as progress so long resumes aren't reaped (#11014) by @ToddHebebrand in #11040
- fix(ai-gateway): fit max_tokens to the endpoint's context window (#10577) by @ToddHebebrand in #11107
- fix(remote): hold a peer drop during a viewer reconnect instead of revoking under it (#10542) by @ToddHebebrand in #11110
- test(e2e): stabilise Portal Dev E2E approve ceremony + cold login (#11094) by @ToddHebebrand in #11106
- feat(web): Add Device remembers the last still-valid token and link per site (#10923) by @ToddHebebrand in #11114
- fix(helper): wait for a signed-in user before launching Assist, never as SYSTEM (#10379) by @ToddHebebrand in #11118
- feat(ai-tools): W18 PR A — org admin and read-only identity tools in chat and MCP (#6789) by @ToddHebebrand in #11089
- feat(agent): vendor update safety core: contract, publisher pin, flash guard, availability gate (#11066) by @ToddHebebrand in #11090
- feat(wisp): specialist post-back, inline step approvals, continue, hand-off prompt (#11085) by @ToddHebebrand in #11115
- feat(security-agents): Bitdefender GravityZone as a framework vendor, dormant (#8170) by @ToddHebebrand in #11112
- fix(backup): keep resume verification across jobs so large resumes reach upload (#11043) by @ToddHebebrand in #11109
- feat(wisp): grant-level unattended reads switch, default off (#11086) by @ToddHebebrand in #11117
- feat(security-agents): admit bitdefender in the coverage vendor CHECK, dormant (#8170) by @ToddHebebrand in #11125
- feat(ai-tools): W18 PR B — portal settings and report recipient writers, four-eyes sensitive portal access (#6789) by @ToddHebebrand in #11128
- docs(plan): AI full control W16 — AI write tools (#6786) by @ToddHebebrand in #11133
- feat(alerts): event_log "Clears when" editor, kind validation + docs (#10768) by @ToddHebebrand in #11120
- test(api): deflake the #10542 lost-hold integration test (1 ms grace raced the Redis write) by @ToddHebebrand in #11131
- feat(api): vendor update status table, gated dispatch seam, results and not-returned monitor (#11068) by @ToddHebebrand in #11126
- docs(plan): snapshot file index out of band — restore browsing for every snapshot (#11026) by @ToddHebebrand in #11136
- fix(wisp): check specialist prerequisites before an assessment raises an approval card (#10487) by @ToddHebebrand in #11138
- fix(wisp): tell the chat model about its own standing loop and identity (#10391) by @ToddHebebrand in #11140
- fix(backup): a torn last journal line no longer discards resume state (#11108) by @ToddHebebrand in #11139
- feat(agent): oem_update_run runner and Dell Command Update lane on fakes (#11067) by @ToddHebebrand in #11127
- ci: cache footprint — restore-only outside the seed, one entry per family, an 8.5 GB budget (#11119) by @ToddHebebrand in #11134
- docs(plan): Backup visibility (#11027) by @ToddHebebrand in #11168
- docs(plan): Ticket SLA performance report (#11018) by @ToddHebebrand in #11169
- test(breeze-backup): fresh root command per test, fixes -count=2 flag leak (#11122) by @ToddHebebrand in #11148
- fix(api): partner dashboard real alertCount and compliance per org (#11039) by @ToddHebebrand in #11132
- docs(plan): record tracking issue #11156 for the snapshot file index plan by @ToddHebebrand in #11170
- fix(remote): a reconnect no longer restarts the session max duration (#11113) by @ToddHebebrand in #11147
- fix(backup): a failed journal restart drops the journal instead of keeping discarded entries (#11144) by @ToddHebebrand in #11150
- fix(web): translate containment refusals; effective-config containment card (#11101) by @ToddHebebrand in #11152
- fix(api,web): return child key id from onboarding-token so remembered CLI tokens are validity-checked (#11116) by @ToddHebebrand in #11151
- feat(web): offer a plain Breeze AI chat beside an active Wisp grant (#10289) by @ToddHebebrand in #11174
- fix(backup): restore browsing for every S3 snapshot (#11026) by @ToddHebebrand in #11175
- feat(agent): Surface lane on fakes and shared BitLocker guard (#11076) by @ToddHebebrand in #11186
- feat(files): add "New folder" to the device file browser (#10975) by @ToddHebebrand in #11188
- ci(gate): base-revision verdict core with replay against real queue runs (#10746) by @ToddHebebrand in #11143
- fix(devices): permanent delete requires a confirmed uninstall or an explicit force (#11153) by @ToddHebebrand in #11172
- feat(backup): plain-language failure categories for backup jobs (#11162) by @ToddHebebrand in #11173
- chore(infra): move Redis default and CI from 7 to 8 (#10978) by @ToddHebebrand in #11193
- fix(ci): dependency audit compares findings by dependency scope (#11137) by @ToddHebebrand in #11187
- feat(ai-tools): W16 PR A — run_patch_plan and create_operator_task launch tools (#6786) by @ToddHebebrand in #11177
- fix(api): per-user rate budget for authenticated dashboard traffic (#10962) by @ToddHebebrand in #11196
- feat(api,web): Run vendor updates route, dialog, device section and history (#11069) by @ToddHebebrand in #11183
- fix(perf): keep sampler running past simulator exit so window end edge is covered by @ToddHebebrand in #11199
- fix(wisp): post a first look to the thread and default the brief zone (#10402) by @ToddHebebrand in #11142
- feat(agent): HP lane on fakes (HPIA) and inert HP BIOS path via installed CMSL (#11078) by @ToddHebebrand in #11200
- fix(wisp): a closed session leaves a real summary, and the assessment picture gets its own column (#10390) by @ToddHebebrand in #11141
- feat(backup): show running backups on the device page with phase, progress and ETA (#11163) by @ToddHebebrand in #11202
- fix(backup): bound system-state collection with deadlines (#11201) by @ToddHebebrand in #11205
- ci(gate): pinned CI Gate workflow — verify, anchor, invariants, runbook (#10746) by @ToddHebebrand in #11207
- test(agent): tolerate System Volume Information in VHDX round-trip cleanup (#11211) by @ToddHebebrand in #11212
- feat(config-policy): oem_updates Vendor updates feature: arming gates, resolver, tab (#11070) by @ToddHebebrand in #11171
- feat(reports): ticket_sla_performance report for MSP staff — W01 (#11166) by @ToddHebebrand in #11176
- feat(ai-tools): W16 PR B — manage_ai_agent_schedules and manage_fleet_designs, partner-axis release (#6786) by @ToddHebebrand in #11208
- fix(remote): stale cleanup keys on the latest start attempt, not the original start (#11149) by @ToddHebebrand in #11189
- feat(backup): uploaded vs reused bytes, why a run was full, incremental-model docs (#11164) by @ToddHebebrand in #11217
- feat(reports): SLA performance as managed evidence and portal-visible on delivery — W02 (#11167) by @ToddHebebrand in #11218
- fix(ai): launch routes answer 503 + failure audit on enqueue failure (#11182) by @ToddHebebrand in #11220
- fix(perf): return workspace ownership to the runner after each perf job by @ToddHebebrand in #11206
- feat(wisp): "I couldn't look yet" post and live first-look progress (#11145, #11146) by @ToddHebebrand in #11221
- fix(perf): give the inject self-test a non-2xx acceptance allowance (#8146) by @ToddHebebrand in #11210
- fix(ai-intents): file an AI tool's intent in the org the action targets (#11181) by @ToddHebebrand in #11223
- feat: overnight reboot hold, Dell schedule takeover and oem_update_release (#11071) by @ToddHebebrand in #11185
- fix(api): caught query failures no longer 500 the request; use withDbTransaction (#11203) by @ToddHebebrand in #11224
- fix(ai-intents): file a row-identified AI write's intent in the row's org (#11222) by @ToddHebebrand in #11228
- perf: first nightly-200 baseline from the self-test run (#8146) by @ToddHebebrand in #11229
- feat(api): vendor update scheduler: occurrences, catch-up, reboot holds, release sweep (#11072) by @ToddHebebrand in #11227
- fix(api): agent and backup catches survive a failed query (#11225) by @ToddHebebrand in #11230
- feat(backup): file index, integrity check and selection at a million files (#11026) by @ToddHebebrand in #11216
- docs(backup): snapshot file list, search, folder restore, release note (#11160) by @ToddHebebrand in #11238
- fix(backup): file-index claim-phase failure reason and rebuild cooldown (#11179, #11180) by @ToddHebebrand in #11239
- fix(security): drop unmaintained pin-utils from the Tauri lockfiles (#11190) by @JonathanPitre in #11198
- feat: Breeze patch jobs leave classes a vendor lane delivers to that lane (#11073) by @ToddHebebrand in #11240
- fix(security): bump klauspost/compress to 1.20.2 (GO-2026-6865) by @ToddHebebrand in #11244
- fix(deploy): cap worker heap at 1 GB via NODE_OPTIONS (#11237) by @ToddHebebrand in #11250
- test(web): guard same-page hash anchors must use HashLink (#9951) by @ToddHebebrand in #11251
- feat(web): Monitor this row action on Remote Tools services and processes (#10927) by @ToddHebebrand in #11253
- feat(tickets): tickets:email_review permission for the inbound email review queue (#10951) by @ToddHebebrand in #11254
- fix(wisp): launch_specialist text states sweep/analysis prerequisites (#10406) by @ToddHebebrand in #11257
- fix(patching): job history distinguishes vendor-managed from no_approved_patches (#11243) by @ToddHebebrand in #11256
- fix(ai-tools): structured split_by_org error for propose_script (#10431) by @ToddHebebrand in #11255
- fix(web): show a 429 as "Please wait" and retry reads after Retry-After (#11195) by @ToddHebebrand in #11252
- feat: vendor updates fleet view, overdue alerts, docs (#11074) by @ToddHebebrand in #11241
- docs(plan): PostgreSQL 17/18 support (#10977) by @ToddHebebrand in #11262
- docs(plan): authenticator app as backup for passkey accounts (#10650) by @ToddHebebrand in #11263
- docs(spec): tool profiles and prompt size for small-context models (#9596) by @ToddHebebrand in #11264
- docs(spec): match external customers to organizations by name (#10358) by @ToddHebebrand in #11265
- docs(spec): Wisp chat and grant follow-up decisions (#10425) by @ToddHebebrand in #11266
- docs(specs): Axcient x360Recover backup-provider design (draft) by @ToddHebebrand in #11246
- chore(release): v0.127.0 pre-tag items — compose passthroughs, What's New, mobile 1.0.3 by @ToddHebebrand in #11274
- fix(web): sweep v0.126.0 → main paper cuts (lifecycle save label, Services heading, purge toast, queued backup job) by @ToddHebebrand in #11286
- feat(backup): Axcient x360Recover provider adapter, paused status, verified-bootable columns (#11270) by @ToddHebebrand in #11289
- feat(backup): Axcient provider surfaces — verified-bootable, per-provider forms, docs (#11271) by @ToddHebebrand in #11290
- fix(patches): hide the Vendor updates tab while the feature flag is off (#11249) by @ToddHebebrand in #11273
- docs(testing): pre-release sweep v0.126.0 → main (10de7d7) by @ToddHebebrand in #11288
- fix(helper): write session config through exclusive temp files by @ToddHebebrand in #11301
Full Changelog: v0.126.0...v0.127.0-rc.2