+ {/* Header */}
+
+
+
+ {hasDevices ? (
+
+ ) : (
+
+ )}
+
+
+ {hasDevices ? "Devices Not Registered" : "No devices reported as not registered in the last 14 days"}
+ {hasDevices && Last 14 days}
+
+ {hasDevices && (
+
+ Devices rejected with HTTP 403 because they were not found in this tenant's Autopilot or Corporate Identifier registry
+
+ )}
+
+
+ {hasDevices && (
+
+ Unverified
+
+ )}
+
+
+
+ {/* Empty-state hint */}
+ {!hasDevices && (
+
+
+ When a device attempts to enroll but is not part of your Autopilot or Corporate Identifier
+ scope, it appears here. An empty list means every device that reached the backend was in scope.
+
+
+ )}
+
+ {/* Data quality notice + table (only when devices exist) */}
+ {hasDevices && (
+ <>
+
+
+
+ This data comes from pre-authentication distress signals. Serial number, manufacturer, and
+ model values are self-reported and unverified. Use it to sanity-check whether your enrollment
+ scoping/assignment covers these devices.
+
+
+
+
+
+
+
+
+
+ | Serial Number |
+ Manufacturer |
+ Model |
+ Attempts |
+ First Seen |
+ Last Seen |
+
+
+
+ {data!.aggregated.map((row, idx) => (
+
+ | {row.serialNumber || "–"} |
+ {row.manufacturer || "–"} |
+ {row.model || "–"} |
+ {row.attemptCount} |
+ {formatDate(row.firstSeen)} |
+ {formatDate(row.lastSeen)} |
+
+ ))}
+
+
+
+
+ {data!.totalRawReports} total rejection{data!.totalRawReports !== 1 ? "s" : ""} across {data!.aggregated.length} device{data!.aggregated.length !== 1 ? "s" : ""}
+
+
+ >
+ )}
+
+ );
+}
diff --git a/src/Web/autopilot-monitor-web/app/settings/tenant/sections/SectionAutopilotValidation.tsx b/src/Web/autopilot-monitor-web/app/settings/tenant/sections/SectionAutopilotValidation.tsx
index 719d8607..06ff7d9a 100644
--- a/src/Web/autopilot-monitor-web/app/settings/tenant/sections/SectionAutopilotValidation.tsx
+++ b/src/Web/autopilot-monitor-web/app/settings/tenant/sections/SectionAutopilotValidation.tsx
@@ -4,6 +4,7 @@ import { useAuth } from "@/contexts/AuthContext";
import { useTenantConfig } from "../../TenantConfigContext";
import { TenantNotifications } from "../../TenantNotifications";
import AutopilotValidationSection from "../../components/AutopilotValidationSection";
+import NotRegisteredDevicesInsights from "../../components/NotRegisteredDevicesInsights";
export function SectionAutopilotValidation() {
const {
@@ -15,7 +16,7 @@ export function SectionAutopilotValidation() {
beginDeviceValidationConsentFlow,
} = useTenantConfig();
- const { user } = useAuth();
+ const { user, getAccessToken } = useAuth();
// DevPrep "Device association" is in Microsoft Private Preview — surface only to Global Admins
// until it ships GA. Backend always rejects writes from non-GA callers regardless of UI.
// TODO(devprep-followup): add vitest DOM-render test asserting toggle is hidden for
@@ -39,6 +40,7 @@ export function SectionAutopilotValidation() {
saving={savingSection === "autopilotValidation"}
onBeginConsent={beginDeviceValidationConsentFlow}
/>
+