Files
lmxopcua/docs/plans/2026-05-28-adminui-driver-pages-plan.md.tasks.json
T

578 lines
15 KiB
JSON

{
"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<DriverStatusHub>"
},
{
"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"
}