Two things lead this release: a new functional design for the notification report, the page recipients open from a DLP notification, rebuilt as one workspace where filters, documents and the open document sit side by side, and Purview Repair, which turns the Purview dashboard from a measurement into a fix by writing sensitivity labels back into Microsoft 365.
TLDR
The notification report has a new design. Filters, the document list and the open document now sit side by side in one workspace. Same data, a lot less noise. You decide whether your organisation gets the new design, the classic one, or the choice, and anyone can switch back from their account menu.
Purview labelling is no longer only a report. Repair now writes the labels. You choose whether Data & More stamps the file or asks the Purview API to apply the label, you can limit a repair to a set of data owners, and every fix is written to a log you can read back.
Know when files disappear. Delete later now counts from a reference date you pick, and colours the remaining time so the urgent cases stand out.
Connect Microsoft 365 from your own tenant. A Global Admin can now build the app registration in their own tenant from a Configure link, with a certificate as the default credential.
Quieter, safer logs. A platform-wide logging standard keeps tokens, email addresses, document text and person data out of the logs, alongside a full security hardening pass.
Release date: October 2026 | Previous version: v26.7.6 (28 October 2026)
Scope: Changes since v26.7.0, including what shipped in the v26.7.1 to v26.7.6 patch releases. The headlines are the new notification report design and Purview Repair. This note also covers tenant-created app registrations, delete later, a large security hardening pass and a broad set of ingestion reliability fixes.
Action required after upgrade. Repairing labels through the Purview API requires an app registration Microsoft will bill: an unbilled app cannot be saved as the label writer, and the Repair panel links it to an Azure subscription for you. One backfill command is needed, at the end of this note.
A new functional design for the notification report
The report a recipient opens from a DLP notification has been rebuilt around the job it is actually used for: look at what was found, open a document, decide. Nothing is taken away, and nobody is moved without being asked.
A new report layout puts filters, the document list and the open document side by side in one workspace
An administrator can force the new design, force the classic design, or leave the choice to each user
Users who have the choice see it once per login, together with a short tour
The layout switcher sits in the classic report header, so switching back takes one click
The mobile report list was rebuilt: edge-to-edge panels, two-line rows showing file type, time before deletion, first class and date, and larger touch targets
Column sort now cycles through ascending, descending and none, with no default sort
Sensitivity labels with no documents are hidden from the report filter
Owner and custom owner can be used as fields in the query builder
Data & More for Purview: Repair
Purview 2.0 shipped in v26.7.0 as scope, business logic, measurement and analysis. This release adds the part that changes something.
Label writer. A repair rule either stamps the label into the file's metadata or asks the Purview API to apply it through Graph
assignSensitivityLabel. Legacy Office formats, locked files and API refusals fall back to stamping, and email is always stampedBilling. Label calls are counted per company and per month. An app registration that Microsoft answers 402 for cannot be saved as the label writer, and Repair links it to an Azure subscription in its own tenant to enable billing. The writer picker shows the cost estimate and a comparison of the two methods
Owner scope. A repair rule can be limited to named data owner users and AD groups, and the affected row counts recalculate for the owners you pick
Repair log. An append-only log records every fix, every stop and every label-writer change, with who did it, when, which class, which labels, which sources, the owner scope and the writer used. Available in the Repair card and at
GET /api/purview/repair/logFailure reasons. When a file cannot be relabelled, the reason is stored on the document and the rule, and the Repair panel opens the run log to show it
Set Business Logic saves every edit at once with an inline Saved hint, and classes with no hits stay in their category instead of collapsing into an Inactive section
Detailed Analysis bar segments show the label name on hover
The Measure shared-data chart leaves out classes hidden from business logic
The exfiltration index has been removed from Measure; the Purview protection score stays
New features
Delete later
A delete later rule counts from a reference date you choose: first notification, last notification, or last edit
When a document has no edit date, the creation date is used instead
Time before deletion is coloured by urgency: red under one day, yellow under seven days
Delete later and move later fields are hidden while enforcement is switched off
The policy history chart has a deleted data tab
Microsoft 365 app registration
A new Configure page lets a Global Admin build the app registration in their own tenant, instead of accepting an invitation link
A certificate is the default credential
Three scopes: Demo is read-only Exchange and OneDrive, while Production and Production + DLP match today's invitation links, except that SharePoint REST no longer also grants
Sites.Read.AllwhenSites.FullControl.Allis grantedSign-in through a delegated app registration: a user outside the registration's Entra group is refused, and the user's own tokens are passed to the api so a mailbox scan can run as that user
Data subjects
Attributes and related people are suggested for a data subject from the values found near them in documents
DLP
A silent Log action records a violation without notifying anyone, and the audit filter is now called All violations
DLP policy and Log action counts appear in fleet status, and DLP tools are included in the dm-mcp installer
The Teams card shows which source the finding came from, using product names
Redaction
Search terms can be saved to a redaction dictionary and applied automatically when a file is processed, and files can be reprocessed against it
File lists are paged per group, with bulk file actions and a block on duplicate folder names
The policy report shows the burned-in redacted document, and the file that was sent can be opened directly in Redaction
Preview files are hidden and deleted after an hour if they are not opened
Documents with nothing selected for redaction are accepted
Image EXIF orientation is applied to the stored source so redaction boxes match the preview
Shared data dashboard
Mail rows keep the sender and the recipients
File rows carry the source, owners, custom owners and who can open them
Clicking a domain limits the account drill-down to that recipient domain
Changes
Security
A full security scan was run across the platform and the findings fixed.
Access control. Users can no longer grant themselves roles or permissions they do not hold. Managing another user's email addresses requires Edit User, and self-added addresses stay unverified. Repository routes are scoped to the caller's company and require Edit Organization. Configuration PUT endpoints are scoped to the caller's company. Report redaction previews and sends are limited to documents in the viewer's own report. Fileshare root paths containing
..are rejected and Add Source is requiredSessions and tokens. Sessions end on suspension, logout and password change. The SSO login state is signed, and the SSO JWT is passed in the URL fragment rather than the query string. Multi-tenant hop tokens are accepted only once and only for the matching deployment and workspace, and refresh and hop tokens are refused where a client token is expected. External invitation tokens are signed with an expiry; unsigned tokens are accepted until April 2027
Service to service. The internal secret is required on the iam admin, all_ids and user sync routes, and on the monthly report trigger. The llm-management service secret is compared in constant time and fails closed when it is not set
Boundaries. MCP aggregations that escape the company scope are rejected. Only Google service account keys are accepted for GCS repositories. Collector fileshare reads and writes stay under
/mnt/data. Splunk logs are sent only to HTTPS URLs on public hosts with TLS verified, from a background taskWebsite sources. Only public HTTP and HTTPS URLs are crawled, every redirect hop is checked, file size is capped, and Chrome runs sandboxed as an unprivileged user instead of as root
HTML reports. Templates and the user-editable executive summary are autoescaped, and WeasyPrint resource fetching is restricted
Logging and privacy
A common logging standard was adopted across iam, api, analytics, client, dlp, ocr, redaction, ai-profiler, llm-management, known-persons-service, ews, imap, google, box, fileshare-service and website-source
Tokens, email addresses, request bodies, document text, LLM output and person data are kept out of logs
PROFILER_LOG_LEVELis replaced byLOG_LEVELin the profiler
Reports and dashboards
Document search priorities were reworked, and the free-text query is now searched the same way as the query array terms
Totals come from the search itself instead of separate count requests, in reports, sources, Azure users, groups and sites, logs and monitored data
Email source counts on the Data Owners page are consistent
Report tabs are capitalised, hidden column labels no longer stretch the header row, and the empty state is worded for filtered results rather than only for a search
The toolbar more menu is hidden when it has no actions
Fixes: API error when searching by path in detailed view, a duplicate request in detailed view, runaway height on the history source and Risk tab charts, doughnut chart label overlap, two-line labels in the risk per department and class chart, rounded corners on Risk chart bars and sankey nodes, a flash during initial load, the Czech flag, the Lithuanian label and the missing Turkish note field
Near search no longer crashes when a term is added, and empty rows are skipped
A report no longer ignores extra clauses on an edited data subject policy
Form, confirmation and delete dialogs were reworked onto one shared modal interface
Sources and ingestion
SharePoint: validation no longer deletes files that still exist, blocked sites are not retried, unresolvable sites no longer fail every cycle, and the company ownership preload and reingestion scan no longer re-run for every site
OneDrive: "this user has no OneDrive" is recognised and no longer re-probed every cycle, and a drive whose delta token Graph has expired is resynced instead of kept
Graph: an expired app registration secret is recognised and the hourly sweeps stop retrying it, a message keeps its stored entry id when Graph refuses to translate it, broker redeliveries are bounded so an acknowledgement timeout cannot re-ingest for ever, and a bad app registration document can no longer kill the ingestion cycle
Exchange: enforcement is paged by cursor and stuck task ids are released, mailbox access is verified before deleting on not found, attachments with no policies are guarded on delete, and the scroll position no longer jumps when deleting documents under a policy
Gmail: a delta run resumes from the saved history cursor
Fileshare: a file that vanishes mid-walk is treated as its own case, retries are bounded for a file that cannot be processed, and the system error branch is bounded
Retention holds: a hold that refuses a delete is recorded instead of retried for ever, and
enforcement_blocked_by_holdis declared on the data indexBox: a daily roster pass, externally owned items on record, and a size cap applied before the hash check
Deleting a source removes its data from the index
Disk usage is now measured and reported once per threshold crossing, with a free-space floor, instead of a hardcoded "(70%)" every five minutes
The front-end static pages are served by nginx instead of the Node pushstate server
Classification and profiling
A rejected LLM classification is distinguishable from one where the LLM was unavailable
The LLM classifier's decision markers are kept out of the nightly tag garbage collection
An algorithm regex that makes the profiler recurse per character is refused, and a stack-overflowing regex no longer makes the profiler abandon the document
Spreadsheets that could not be read are not profiled, and failed OCR documents get a terminal state with the cause logged
Known person text values are matched as phrases, and tagging is logged per person
The ai-profiler reports rejected bulk updates and writes the terminal status synchronously, so a document cannot be retried every 60 seconds for ever
Azure users whose directory id no longer matches are re-bound
OCR
Image size is capped, workers are recycled and images are read at 3000 px to stop memory blow-ups
An unreadable PDF is no longer committed as a fully OCR'd document with no text
A tunable that is empty or unparseable falls back to its declared default
The signature detector no longer prints a block per inference
Monitoring
The slow-ingestion check now distinguishes a stalled backfill from a stale delta run and from a probe it could not perform, derives the staleness window from the source's own delta cadence, and says in the alert which of the three it was
The fatal log signature check alerts when it cannot run
The
tag_update_issuealert is stored rather than raisedPaginated Elasticsearch helpers return every page
Two ingestion outages found by monitoring were fixed at the source: an Elasticsearch blip that killed every OCR worker at start-up and became a permanent respawn storm, and a RabbitMQ channel exhaustion that put graph ingestion into a consumer restart loop
Platform
llm-management is served by gunicorn with a 600 second timeout for blocking completions, instead of the Flask development server
The java profiler sends the internal secret when loading company ids from iam, and the profiling trace is off the default log level
"Nothing to enforce" is distinguishable from a failed source lookup
The app registration support email is sent through the task worker, so an unreachable mail server cannot break demo setup
Deployment
Backfill the company id on notified users:
docker exec -it api flask --app=manage backfill_notified_users_company_id
The purview_repair_log index and its mapping are created on startup, like the other Purview indices. No action needed.