diff --git a/src/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Modbus/ModbusDiagnostics.razor b/src/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Modbus/ModbusDiagnostics.razor
new file mode 100644
index 0000000..7a05d59
--- /dev/null
+++ b/src/ZB.MOM.WW.OtOpcUa.Admin/Components/Pages/Modbus/ModbusDiagnostics.razor
@@ -0,0 +1,120 @@
+@page "/modbus/diagnostics/{DriverInstanceId}"
+@using ZB.MOM.WW.OtOpcUa.Admin.Services
+@inject DriverDiagnosticsClient Diagnostics
+
+@*
+ #154 — operator-facing view of the Server's auto-prohibition state for a Modbus driver.
+ Fetches via DriverDiagnosticsClient (HttpClient against the Server's HealthEndpointsHost).
+ Refreshes on demand; auto-refresh is a future task once a SignalR diag channel exists.
+*@
+
+Modbus diagnostics — @DriverInstanceId
+
+
+
Modbus auto-prohibitions
+
+ Driver instance @DriverInstanceId. Live snapshot of coalesced ranges
+ the planner has learned to read individually (#148 / #150 / #151 / #152).
+
+
+
+
+ @if (_lastRefreshed is not null)
+ {
+ Last refreshed @_lastRefreshed.Value.ToLocalTime().ToString("HH:mm:ss")
+ }
+
+
+ @if (_error is not null)
+ {
+
@_error
+ }
+ else if (_response is null)
+ {
+
Click Refresh to load.
+ }
+ else if (_response.Count == 0)
+ {
+
No auto-prohibitions. The planner is coalescing freely.
+ }
+ else
+ {
+
+
+
+
Unit
+
Region
+
Start
+
End
+
Span
+
Status
+
Last probed
+
+
+
+ @foreach (var r in _response.Ranges.OrderBy(r => r.UnitId).ThenBy(r => r.Region).ThenBy(r => r.StartAddress))
+ {
+