{ "planPath": "docs/plans/2026-05-28-adminui-driver-pages-plan.md", "designPath": "docs/plans/2026-05-28-adminui-driver-pages-design.md", "reconciledNote": "RECONCILED 2026-06-18: a seam-by-seam audit confirmed Phases 6-10 are ALL shipped on master (the pre-2026-06-18 'pending' states below were stale). Phase 6 (live DriverStatusPanel) + Phase 8 (Reconnect/Restart) are wired end-to-end (DriverHealthChanged contract, AkkaDriverHealthPublisher invoked at DriverInstanceActor.PublishHealthSnapshot, admin-gated DriverStatusSignalRBridge spawn, snapshot store, hub, panel in all 9 driver pages, AdminOperationsActor/DriverHostActor handlers). Phase 7 probes + Phase 9 typed pickers shipped. Phase 10 E2E tests (DriverTestConnect/DriverReconnect/DriverStatusHub) shipped at 494da22c. The genuine remnant \u2014 a deployed-driver Healthy->Reconnecting->Healthy E2E + a production-fidelity harness fix (AddOtOpcUaRuntime) \u2014 was added by docs/plans/2026-06-18-driver-pages-reconnect-e2e.md.", "executionState": "COMPLETE", "tasks": [ { "id": "0.1", "subject": "Create AdminUI test project + slnx entry + placeholder test", "status": "completed", "commit": "dc12c37" }, { "id": "1.1", "subject": "Driver.Modbus.Contracts \u2014 extract ModbusDriverOptions", "status": "completed", "blockedBy": [ "0.1" ], "commit": "5058a56" }, { "id": "1.2", "subject": "Driver.AbCip.Contracts \u2014 extract AbCipDriverOptions", "status": "completed", "blockedBy": [ "0.1" ], "commit": "b474d63" }, { "id": "1.3", "subject": "Driver.AbLegacy.Contracts \u2014 extract AbLegacyDriverOptions", "status": "completed", "blockedBy": [ "0.1" ], "commit": "4902295" }, { "id": "1.4", "subject": "Driver.S7.Contracts \u2014 extract S7DriverOptions", "status": "completed", "blockedBy": [ "0.1" ], "commit": "9f62f2c" }, { "id": "1.5", "subject": "Driver.TwinCAT.Contracts \u2014 extract TwinCATDriverOptions", "status": "completed", "blockedBy": [ "0.1" ], "commit": "a88721c" }, { "id": "1.6", "subject": "Driver.FOCAS.Contracts \u2014 extract FocasDriverOptions", "status": "completed", "blockedBy": [ "0.1" ], "commit": "d892ab9" }, { "id": "1.7", "subject": "Driver.OpcUaClient.Contracts \u2014 extract OpcUaClientDriverOptions", "status": "completed", "blockedBy": [ "0.1" ], "commit": "5f0e048" }, { "id": "1.8", "subject": "Driver.Galaxy.Contracts \u2014 extract GalaxyDriverOptions", "status": "completed", "blockedBy": [ "0.1" ], "commit": "5ffbc42" }, { "id": "1.9", "subject": "Driver.Historian.Wonderware.Client.Contracts \u2014 extract options", "status": "completed", "blockedBy": [ "0.1" ], "commit": "8c0a320" }, { "id": "1.10", "subject": "Add ProbeTimeoutSeconds to all 9 Options classes + slnx validation", "status": "completed", "blockedBy": [ "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9" ], "commit": "f2f6eeb" }, { "id": "2.1", "subject": "DriverFormShell.razor", "status": "completed", "blockedBy": [ "0.1" ], "commit": "85af126" }, { "id": "2.2", "subject": "DriverIdentitySection.razor", "status": "completed", "blockedBy": [ "0.1" ], "commit": "1ff3875" }, { "id": "2.3", "subject": "DriverResilienceSection.razor", "status": "completed", "blockedBy": [ "0.1" ], "commit": "a008530" }, { "id": "2.4", "subject": "Wire shared sections into existing DriverEdit.razor", "status": "completed", "blockedBy": [ "2.1", "2.2", "2.3" ], "commit": "a28f4cd" }, { "id": "3.1", "subject": "DriverTypePicker.razor (route: /drivers/new)", "status": "completed", "blockedBy": [ "2.4" ], "commit": "c0ce5d0" }, { "id": "3.2", "subject": "DriverEditRouter.razor with DynamicComponent dispatch", "status": "completed", "blockedBy": [ "2.4" ], "commit": "55e8bf7" }, { "id": "3.3", "subject": "Hand /drivers/new from DriverEdit to DriverTypePicker", "status": "completed", "blockedBy": [ "3.1" ], "commit": "27b3a01" }, { "id": "3.4", "subject": "Hand /drivers/{id} from DriverEdit to DriverEditRouter (fallback to DriverEdit)", "status": "completed", "blockedBy": [ "3.2", "3.3" ], "commit": "27b3a01" }, { "id": "4.0", "subject": "AdminUI csproj references all 9 Driver.*.Contracts", "status": "completed", "blockedBy": [ "1.10", "3.4" ], "commit": "7014c93" }, { "id": "4.1", "subject": "ModbusDriverPage.razor + serialization test", "status": "completed", "blockedBy": [ "4.0" ], "commit": "a3073d1" }, { "id": "4.2", "subject": "AbCipDriverPage.razor + serialization test", "status": "completed", "blockedBy": [ "4.0" ], "commit": "dc21cba" }, { "id": "4.3", "subject": "AbLegacyDriverPage.razor + serialization test", "status": "completed", "blockedBy": [ "4.0" ], "commit": "059a621" }, { "id": "4.4", "subject": "S7DriverPage.razor + serialization test", "status": "completed", "blockedBy": [ "4.0" ], "commit": "5cad9b2" }, { "id": "4.5", "subject": "TwinCatDriverPage.razor + serialization test", "status": "completed", "blockedBy": [ "4.0" ], "commit": "dfbf679" }, { "id": "4.6", "subject": "FocasDriverPage.razor + serialization test", "status": "completed", "blockedBy": [ "4.0" ], "commit": "8149739" }, { "id": "4.7", "subject": "OpcUaClientDriverPage.razor + serialization test", "status": "completed", "blockedBy": [ "4.0" ], "commit": "efcc231" }, { "id": "4.8", "subject": "GalaxyDriverPage.razor + serialization test", "status": "completed", "blockedBy": [ "4.0" ], "commit": "a243cfd" }, { "id": "4.9", "subject": "HistorianWonderwareDriverPage.razor + serialization test", "status": "completed", "blockedBy": [ "4.0" ], "commit": "2c16062" }, { "id": "4.10", "subject": "Wire all 9 typed pages into DriverEditRouter._componentMap", "status": "completed", "blockedBy": [ "4.1", "4.2", "4.3", "4.4", "4.5", "4.6", "4.7", "4.8", "4.9" ], "commit": "5f8fa70" }, { "id": "4.11", "subject": "Fixup: S7 Tags data-loss + missing FormModel tests (post-review)", "status": "completed", "blockedBy": [ "4.10" ], "commit": "c4086c2" }, { "id": "5.1", "subject": "Delete DriverEdit.razor + remove fallback in DriverEditRouter", "status": "completed", "blockedBy": [ "4.1", "4.2", "4.3", "4.4", "4.5", "4.6", "4.7", "4.8", "4.9" ], "commit": "a971db3" }, { "id": "6.1", "subject": "DriverHealthChanged DPS message contract", "status": "completed", "blockedBy": [ "5.1" ], "note": "shipped \u2014 Commons/Messages/Drivers/DriverHealthChanged.cs (verified 2026-06-18)" }, { "id": "6.2", "subject": "Publish DriverHealthChanged from each driver actor (IDriverHealthPublisher)", "status": "completed", "blockedBy": [ "6.1" ], "note": "shipped \u2014 AkkaDriverHealthPublisher (DI-bound prod) invoked at DriverInstanceActor.PublishHealthSnapshot" }, { "id": "6.3", "subject": "DriverStatusHub", "status": "completed", "blockedBy": [ "6.1" ], "note": "shipped \u2014 DriverStatusHub.cs, mapped via MapHub" }, { "id": "6.4", "subject": "DriverStatusSignalRBridge + InMemoryDriverStatusSnapshotStore", "status": "completed", "blockedBy": [ "6.2", "6.3" ], "note": "shipped \u2014 bridge spawned admin-gated (HubServiceCollectionExtensions:69, Program.cs:196); store singleton" }, { "id": "6.5", "subject": "DriverStatusPanel.razor + wire into all 9 driver pages", "status": "completed", "blockedBy": [ "6.4" ], "note": "shipped \u2014 in-process snapshot-store subscription (dodges Traefik self-hub trap), wired into all 9 driver pages" }, { "id": "7.1", "subject": "IDriverProbe interface + TestDriverConnect messages", "status": "completed", "blockedBy": [ "5.1" ], "note": "shipped \u2014 Phase 7 probes (per design note + reconcile)" }, { "id": "7.2", "subject": "AdminOperationsActor handler for TestDriverConnect", "status": "completed", "blockedBy": [ "7.1" ], "note": "shipped" }, { "id": "7.3", "subject": "TCP probes (Modbus, AbCip, AbLegacy, S7)", "status": "completed", "blockedBy": [ "7.1" ], "note": "shipped \u2014 upgraded TCP->protocol handshake (961b2b55 & per-driver)" }, { "id": "7.4", "subject": "Specialty probes (FOCAS, TwinCAT, OPCUA, Galaxy, Historian)", "status": "completed", "blockedBy": [ "7.1" ], "note": "shipped" }, { "id": "7.5", "subject": "AdminProbeService + DriverTestConnectButton.razor + wire into pages", "status": "completed", "blockedBy": [ "7.2", "7.3", "7.4" ], "note": "shipped" }, { "id": "8.1", "subject": "RestartDriver + ReconnectDriver messages + AdminOperationsActor handlers", "status": "completed", "blockedBy": [ "6.5", "7.5" ], "note": "shipped \u2014 Commons/Messages/Admin + AdminOperationsActor + DriverHostActor handlers" }, { "id": "8.2", "subject": "DriverOperator authorization policy + docs/Security.md update", "status": "completed", "blockedBy": [ "6.5" ], "note": "shipped \u2014 DriverOperator policy gates the panel buttons" }, { "id": "8.3", "subject": "Wire Reconnect/Restart buttons into DriverStatusPanel", "status": "completed", "blockedBy": [ "8.1", "8.2" ], "note": "shipped \u2014 DriverOperator-gated Reconnect/Restart in DriverStatusPanel.razor" }, { "id": "9.1", "subject": "DriverTagPicker.razor modal shell", "status": "completed", "blockedBy": [ "5.1" ], "note": "shipped \u2014 Phase 9 typed address pickers for all 9 drivers (reconcile)" }, { "id": "9.2", "subject": "Modbus address picker body + unit test", "status": "completed", "blockedBy": [ "9.1" ], "note": "shipped" }, { "id": "9.3", "subject": "AbCip address picker body + unit test", "status": "completed", "blockedBy": [ "9.1" ], "note": "shipped" }, { "id": "9.4", "subject": "AbLegacy address picker body + unit test", "status": "completed", "blockedBy": [ "9.1" ], "note": "shipped" }, { "id": "9.5", "subject": "S7 address picker body + unit test", "status": "completed", "blockedBy": [ "9.1" ], "note": "shipped" }, { "id": "9.6", "subject": "TwinCat address picker body + unit test", "status": "completed", "blockedBy": [ "9.1" ], "note": "shipped" }, { "id": "9.7", "subject": "FOCAS address picker body + unit test", "status": "completed", "blockedBy": [ "9.1" ], "note": "shipped" }, { "id": "9.8", "subject": "OpcUaClient picker body (free-text NodeId)", "status": "completed", "blockedBy": [ "9.1" ], "note": "shipped" }, { "id": "9.9", "subject": "Galaxy picker body (free-text tag_name.AttributeName)", "status": "completed", "blockedBy": [ "9.1" ], "note": "shipped" }, { "id": "9.10", "subject": "Historian.Wonderware picker body + unit test", "status": "completed", "blockedBy": [ "9.1" ], "note": "shipped" }, { "id": "10.1", "subject": "DriverTestConnectE2eTests (Modbus/AbCip/S7 vs Docker sims)", "status": "completed", "blockedBy": [ "8.3", "9.10" ], "commit": "494da22c", "note": "shipped (skip-gated on sim reachability)" }, { "id": "10.2", "subject": "DriverReconnectE2eTests", "status": "completed", "blockedBy": [ "8.3", "9.10" ], "commit": "494da22c", "note": "shipped; deferred deeper deployed-driver Healthy->Reconnecting->Healthy transition CLOSED 2026-06-18 (docs/plans/2026-06-18-driver-pages-reconnect-e2e.md)" }, { "id": "10.3", "subject": "DriverStatusHubE2eTests", "status": "completed", "blockedBy": [ "8.3", "9.10" ], "commit": "494da22c", "note": "shipped (mock IHubContext + manual bridge spawn)" }, { "id": "10.4", "subject": "Manual smoke checklist (documented)", "status": "obsolete", "blockedBy": [ "10.1", "10.2", "10.3" ], "note": "Closed 2026-08-10 as obsolete (was: design \u00a78.3 checklist authored; automated coverage substantially supersedes it (new deployed-driver reconnect E2E + green driver E2E suite 2026-06-18). Full browser smoke recording NOT executed (deferred \u2014 login-disabled docker-dev rig drive).) \u2014 the routed /clusters/{id}/drivers flow this checklist smokes (DriverTypePicker, DriverEditRouter, the 8 *DriverPage shells) was retired in v3 Batch 2; no driver pages exist under Components/Pages/. The form bodies live on inside the /raw modals, which were live-gated repeatedly across the 2026-07/08 issue rounds (see deferment.md \u00a79)." } ], "lastUpdated": "2026-06-18" }