docs(plans): open-plan-task sweep — followups-batch T9 (Modbus-Int64) + T10 (S7/AbCip probe E2E) verified live PASS; fixedtree T11 + adminui 10.4 closed obsolete (v3 deleted their subjects); open plan tasks 7 -> 3
This commit is contained in:
@@ -1,78 +1,578 @@
|
||||
{
|
||||
"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 — a deployed-driver Healthy->Reconnecting->Healthy E2E + a production-fidelity harness fix (AddOtOpcUaRuntime) — was added by docs/plans/2026-06-18-driver-pages-reconnect-e2e.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 — extract ModbusDriverOptions", "status": "completed", "blockedBy": ["0.1"], "commit": "5058a56"},
|
||||
{"id": "1.2", "subject": "Driver.AbCip.Contracts — extract AbCipDriverOptions", "status": "completed", "blockedBy": ["0.1"], "commit": "b474d63"},
|
||||
{"id": "1.3", "subject": "Driver.AbLegacy.Contracts — extract AbLegacyDriverOptions", "status": "completed", "blockedBy": ["0.1"], "commit": "4902295"},
|
||||
{"id": "1.4", "subject": "Driver.S7.Contracts — extract S7DriverOptions", "status": "completed", "blockedBy": ["0.1"], "commit": "9f62f2c"},
|
||||
{"id": "1.5", "subject": "Driver.TwinCAT.Contracts — extract TwinCATDriverOptions", "status": "completed", "blockedBy": ["0.1"], "commit": "a88721c"},
|
||||
{"id": "1.6", "subject": "Driver.FOCAS.Contracts — extract FocasDriverOptions", "status": "completed", "blockedBy": ["0.1"], "commit": "d892ab9"},
|
||||
{"id": "1.7", "subject": "Driver.OpcUaClient.Contracts — extract OpcUaClientDriverOptions", "status": "completed", "blockedBy": ["0.1"], "commit": "5f0e048"},
|
||||
{"id": "1.8", "subject": "Driver.Galaxy.Contracts — extract GalaxyDriverOptions", "status": "completed", "blockedBy": ["0.1"], "commit": "5ffbc42"},
|
||||
{"id": "1.9", "subject": "Driver.Historian.Wonderware.Client.Contracts — 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 — 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 — AkkaDriverHealthPublisher (DI-bound prod) invoked at DriverInstanceActor.PublishHealthSnapshot"},
|
||||
{"id": "6.3", "subject": "DriverStatusHub", "status": "completed", "blockedBy": ["6.1"], "note": "shipped — DriverStatusHub.cs, mapped via MapHub<DriverStatusHub>"},
|
||||
{"id": "6.4", "subject": "DriverStatusSignalRBridge + InMemoryDriverStatusSnapshotStore", "status": "completed", "blockedBy": ["6.2","6.3"], "note": "shipped — 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 — 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 — 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 — 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 — Commons/Messages/Admin + AdminOperationsActor + DriverHostActor handlers"},
|
||||
{"id": "8.2", "subject": "DriverOperator authorization policy + docs/Security.md update", "status": "completed", "blockedBy": ["6.5"], "note": "shipped — 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 — DriverOperator-gated Reconnect/Restart in DriverStatusPanel.razor"},
|
||||
|
||||
{"id": "9.1", "subject": "DriverTagPicker.razor modal shell", "status": "completed", "blockedBy": ["5.1"], "note": "shipped — 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": "partial", "blockedBy": ["10.1","10.2","10.3"], "note": "design §8.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 — login-disabled docker-dev rig drive)."}
|
||||
{
|
||||
"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"
|
||||
}
|
||||
}
|
||||
@@ -12,17 +12,167 @@
|
||||
"reconsiderGates": "T7 BUILT+SHIPPED (FB-7, master 30c9821f). T8 NOT built (awaiting explicit go-ahead). T9/T10 DONE (FB-9/FB-10, live-verified). T11 PARTIAL: Phase B native-alarm pipeline PROVEN live 2026-06-19 (Galaxy! ConditionId-prefix finding); Phase C HistoryRead + H6 ack->AVEVA + AbLegacy/FOCAS/TwinCAT probes remain AVEVA/hardware/no-local-target deferred."
|
||||
},
|
||||
"tasks": [
|
||||
{"id": 1, "ref": "A1", "subject": "OpcUaClient history session-capture-before-gate race fix", "classification": "standard", "status": "completed", "commits": ["eb328e57","eede0c92"], "parallelizableWith": [2,3,4,5,6], "group": "A-actionable"},
|
||||
{"id": 2, "ref": "A2", "subject": "Client.CLI enable/disable command (H4 client path)", "classification": "standard", "status": "completed", "commits": ["88d5ba45","f81fa768"], "parallelizableWith": [1,3,4,5,6], "group": "A-actionable"},
|
||||
{"id": 3, "ref": "A3", "subject": "Cert-audit minor review nits (unreachable fallthrough comment + single PkiStoreRoot read)", "classification": "trivial", "status": "completed", "commits": ["6223bc97"], "parallelizableWith": [1,2,4,5,6], "group": "A-actionable"},
|
||||
{"id": 4, "ref": "B2", "subject": "AdminUI: preserve edited alarm fields on Galaxy address re-pick", "classification": "small", "status": "completed", "commits": ["2dd723e1","e047af05"], "liveVerify": "substantial (picker+gateway-browse+config-commit confirmed; final pick-and-assert blocked by object-browser href quirk; preservation unit-tested)", "parallelizableWith": [1,2,3,5,6], "group": "B-deferred"},
|
||||
{"id": 5, "ref": "B3", "subject": "AdminUI: refresh script dropdown label after inline create", "classification": "small", "status": "completed", "commits": ["da57c307","d8254630"], "liveVerify": "PASS (inline New script -> dropdown label = new script)", "parallelizableWith": [1,2,3,4,6], "group": "B-deferred"},
|
||||
{"id": 6, "ref": "B1", "subject": "Write-outcome residuals: Bad-quality blip + AuditWriteUpdateEvent + sync fail-fast", "classification": "standard", "status": "completed", "commits": ["36eb14e8","85afb678"], "note": "production already shipped bb59fd4e 2026-06-15; delivered missing behavioural test coverage + private->internal seam", "parallelizableWith": [1,2,3,4,5], "group": "B-deferred"},
|
||||
{"id": 7, "ref": "B4", "subject": "F10b surgical DataType/IsArray in-place writes", "classification": "standard", "status": "pending", "gate": "RECONSIDER — previously decided against (dirty); do NOT build without explicit go-ahead", "group": "B-reconsider"},
|
||||
{"id": 8, "ref": "B5", "subject": "Alarm-severity SetSeverity surgical update", "classification": "small", "status": "pending", "gate": "RECONSIDER — operationally invisible (alarm engine overwrites); do NOT build without explicit go-ahead", "group": "B-reconsider"},
|
||||
{"id": 9, "ref": "C1", "subject": "Modbus-Int64 full live authoring on docker-dev", "classification": "verify", "status": "pending", "note": "operator/rig verify-only; seed a Modbus driver", "group": "C-verify"},
|
||||
{"id": 10, "ref": "C2", "subject": "S7 + AbCip Test-Connect probe happy-path live-verify", "classification": "verify", "status": "pending", "note": "needs lmxopcua-fix fixtures from the Windows VM", "group": "C-verify"},
|
||||
{"id": 11, "ref": "C3", "subject": "Device-gated proofs (H6 ack→AVEVA, Phase C T7, Phase B T9, AbLegacy/TwinCAT/FOCAS probe)", "classification": "blocked", "status": "partial", "note": "Live-assessed 2026-06-19 (gateway 10.100.0.48:5120 reachable from this Mac, so the 'all blocked' label was partly stale). OUTCOMES: (Phase B T9) DONE — native-alarm PIPELINE proven end-to-end live on docker-dev: authored a Galaxy alarm tag (FullName=Galaxy!TestArea.TestMachine_001.TestAlarm001, alarm{alarmType:OffNormalAlarm,severity:750}) -> Galaxy driver opened the native-alarm subscription (previously-gated path) -> gateway transition materialised Part 9 condition GalaxyNativeAlarm (ns=2;s=EQ-55297329838d/GalaxyNativeAlarm) carrying the EXACT gateway raise time 2026-05-24T16:04:10.856Z, surfaced via ConditionRefresh. KEY FINDING: ConditionId match REQUIRES the 'Galaxy!' source prefix on the authored FullName (without it every transition is silently dropped). Severity 700 = MapSeverity(750) (MediumHigh bucket), not a bug. Net state Inactive/Unacked because the gateway replays weeks-old historical raises -> a fresh Active-state + live /alerts row needs an alarm triggered on the AVEVA side. (Phase C T7) DEFERRED config+data-gated — confirmed the historized Galaxy node materialises + server HistoryRead path returns GoodNoData/0-values with ServerHistorian.Enabled=false (correct NullHistorianDataSource degrade); live data needs enabling ServerHistorian + Wonderware sidecar on 10.100.0.48 + actual stored history (synthetic ref has none). (H6 ack->AVEVA) DEFERRED — ack SEND reachable but Galaxy AckMsg is write-only/fire-and-forget; confirming it LANDED needs AVEVA-side observation on 10.100.0.48. (AbLegacy/FOCAS/TwinCAT probe) DEFERRED — no local sims running + no live-target probe harness; TwinCAT(ADS) genuinely has no rig target. Rig restored (alarm tag removed, Galaxy back to value-only).", "group": "C-blocked"}
|
||||
{
|
||||
"id": 1,
|
||||
"ref": "A1",
|
||||
"subject": "OpcUaClient history session-capture-before-gate race fix",
|
||||
"classification": "standard",
|
||||
"status": "completed",
|
||||
"commits": [
|
||||
"eb328e57",
|
||||
"eede0c92"
|
||||
],
|
||||
"parallelizableWith": [
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6
|
||||
],
|
||||
"group": "A-actionable"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"ref": "A2",
|
||||
"subject": "Client.CLI enable/disable command (H4 client path)",
|
||||
"classification": "standard",
|
||||
"status": "completed",
|
||||
"commits": [
|
||||
"88d5ba45",
|
||||
"f81fa768"
|
||||
],
|
||||
"parallelizableWith": [
|
||||
1,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6
|
||||
],
|
||||
"group": "A-actionable"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"ref": "A3",
|
||||
"subject": "Cert-audit minor review nits (unreachable fallthrough comment + single PkiStoreRoot read)",
|
||||
"classification": "trivial",
|
||||
"status": "completed",
|
||||
"commits": [
|
||||
"6223bc97"
|
||||
],
|
||||
"parallelizableWith": [
|
||||
1,
|
||||
2,
|
||||
4,
|
||||
5,
|
||||
6
|
||||
],
|
||||
"group": "A-actionable"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"ref": "B2",
|
||||
"subject": "AdminUI: preserve edited alarm fields on Galaxy address re-pick",
|
||||
"classification": "small",
|
||||
"status": "completed",
|
||||
"commits": [
|
||||
"2dd723e1",
|
||||
"e047af05"
|
||||
],
|
||||
"liveVerify": "substantial (picker+gateway-browse+config-commit confirmed; final pick-and-assert blocked by object-browser href quirk; preservation unit-tested)",
|
||||
"parallelizableWith": [
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
5,
|
||||
6
|
||||
],
|
||||
"group": "B-deferred"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"ref": "B3",
|
||||
"subject": "AdminUI: refresh script dropdown label after inline create",
|
||||
"classification": "small",
|
||||
"status": "completed",
|
||||
"commits": [
|
||||
"da57c307",
|
||||
"d8254630"
|
||||
],
|
||||
"liveVerify": "PASS (inline New script -> dropdown label = new script)",
|
||||
"parallelizableWith": [
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
6
|
||||
],
|
||||
"group": "B-deferred"
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"ref": "B1",
|
||||
"subject": "Write-outcome residuals: Bad-quality blip + AuditWriteUpdateEvent + sync fail-fast",
|
||||
"classification": "standard",
|
||||
"status": "completed",
|
||||
"commits": [
|
||||
"36eb14e8",
|
||||
"85afb678"
|
||||
],
|
||||
"note": "production already shipped bb59fd4e 2026-06-15; delivered missing behavioural test coverage + private->internal seam",
|
||||
"parallelizableWith": [
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5
|
||||
],
|
||||
"group": "B-deferred"
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"ref": "B4",
|
||||
"subject": "F10b surgical DataType/IsArray in-place writes",
|
||||
"classification": "standard",
|
||||
"status": "pending",
|
||||
"gate": "RECONSIDER \u2014 previously decided against (dirty); do NOT build without explicit go-ahead",
|
||||
"group": "B-reconsider"
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"ref": "B5",
|
||||
"subject": "Alarm-severity SetSeverity surgical update",
|
||||
"classification": "small",
|
||||
"status": "pending",
|
||||
"gate": "RECONSIDER \u2014 operationally invisible (alarm engine overwrites); do NOT build without explicit go-ahead",
|
||||
"group": "B-reconsider"
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"ref": "C1",
|
||||
"subject": "Modbus-Int64 full live authoring on docker-dev",
|
||||
"classification": "verify",
|
||||
"status": "completed",
|
||||
"note": "VERIFIED PASS 2026-08-10 on docker-dev (rig rebuilt to master 481f4343, image parity asserted across all 6 nodes). Authored Int64 raw tag TASK9-INT64 (RawPath pymodbus/plc/Task9Int64, TagConfig region=HoldingRegisters address=200 dataType=Int64 BigEndian) via ConfigDb + headless deploy API; deployment b4d7c8be sealed (Status=2). Node advertises DataType i=8 (Int64), ValueRank -1, Good, on BOTH :4840 and :4841; value 347340207162261544 is the exact BigEndian decode of HR200-203=(1234,20,30,40). Value-change propagation proven by driving HR203 via FC06 (observed via subscribe on both centrals; registers restored after). Fixture caveat: the standard profile has NO naturally-churning 4-register span (HR100 is isolated; spans over it return ILLEGAL DATA ADDRESS), so churn was externally driven. No product gap. Tag row left in place, deployed and serving, consistent with prior gate rows.",
|
||||
"group": "C-verify"
|
||||
},
|
||||
{
|
||||
"id": 10,
|
||||
"ref": "C2",
|
||||
"subject": "S7 + AbCip Test-Connect probe happy-path live-verify",
|
||||
"classification": "verify",
|
||||
"status": "completed",
|
||||
"note": "VERIFIED PASS 2026-08-10: DriverProbeHandshakeE2eTests 12/12 passed, 0 skipped (S7_Green_AgainstSim, AbCip_Green_AgainstSim with 'CIP session OK' proving a real authored-tag read, AbCip_WithNoAuthoredTags_ReportsTheControllerReachable, plus Modbus/OpcUaClient/local-rig/Galaxy legs \u2014 mxaccessgw on 10.100.0.48 happened to be reachable). Correction to the task's premise: skip-gating is pure TCP reachability (DockerFixtureAvailability.IsReachable), NOT env vars, and the checked-in defaults already point at 10.100.0.35 \u2014 runnable from macOS directly; the 'needs Windows-VM fixtures' note was stale. S7 fixture started then removed (net zero); AbCip was already up (5 days) and left as found.",
|
||||
"group": "C-verify"
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"ref": "C3",
|
||||
"subject": "Device-gated proofs (H6 ack\u2192AVEVA, Phase C T7, Phase B T9, AbLegacy/TwinCAT/FOCAS probe)",
|
||||
"classification": "blocked",
|
||||
"status": "partial",
|
||||
"note": "Live-assessed 2026-06-19 (gateway 10.100.0.48:5120 reachable from this Mac, so the 'all blocked' label was partly stale). OUTCOMES: (Phase B T9) DONE \u2014 native-alarm PIPELINE proven end-to-end live on docker-dev: authored a Galaxy alarm tag (FullName=Galaxy!TestArea.TestMachine_001.TestAlarm001, alarm{alarmType:OffNormalAlarm,severity:750}) -> Galaxy driver opened the native-alarm subscription (previously-gated path) -> gateway transition materialised Part 9 condition GalaxyNativeAlarm (ns=2;s=EQ-55297329838d/GalaxyNativeAlarm) carrying the EXACT gateway raise time 2026-05-24T16:04:10.856Z, surfaced via ConditionRefresh. KEY FINDING: ConditionId match REQUIRES the 'Galaxy!' source prefix on the authored FullName (without it every transition is silently dropped). Severity 700 = MapSeverity(750) (MediumHigh bucket), not a bug. Net state Inactive/Unacked because the gateway replays weeks-old historical raises -> a fresh Active-state + live /alerts row needs an alarm triggered on the AVEVA side. (Phase C T7) DEFERRED config+data-gated \u2014 confirmed the historized Galaxy node materialises + server HistoryRead path returns GoodNoData/0-values with ServerHistorian.Enabled=false (correct NullHistorianDataSource degrade); live data needs enabling ServerHistorian + Wonderware sidecar on 10.100.0.48 + actual stored history (synthetic ref has none). (H6 ack->AVEVA) DEFERRED \u2014 ack SEND reachable but Galaxy AckMsg is write-only/fire-and-forget; confirming it LANDED needs AVEVA-side observation on 10.100.0.48. (AbLegacy/FOCAS/TwinCAT probe) DEFERRED \u2014 no local sims running + no live-target probe harness; TwinCAT(ADS) genuinely has no rig target. Rig restored (alarm tag removed, Galaxy back to value-only).",
|
||||
"group": "C-blocked"
|
||||
}
|
||||
],
|
||||
"lastUpdated": "2026-06-19"
|
||||
}
|
||||
}
|
||||
@@ -1,23 +1,152 @@
|
||||
{
|
||||
"planPath": "docs/plans/2026-06-26-otopcua-fixedtree-followups.md",
|
||||
"tasks": [
|
||||
{"id": 1, "subject": "Task 1: Injectable discovery timeout (A)", "status": "completed", "nativeId": 38, "commits": ["c2c368dc"]},
|
||||
{"id": 2, "subject": "Task 2: RediscoverPolicy enum + driver overrides (B1)", "status": "completed", "nativeId": 39, "commits": ["a378b572", "efbdaf85"]},
|
||||
{"id": 3, "subject": "Task 3: DriverInstanceActor honors policy (B2)", "status": "completed", "blockedBy": [1, 2], "nativeId": 40, "commits": ["ce34816a", "a1a655e6"]},
|
||||
{"id": 4, "subject": "Task 4: TriggerRediscovery message + handler (C1)", "status": "completed", "blockedBy": [3], "nativeId": 41, "commits": ["f7358bf4", "e7d5ebe9"]},
|
||||
{"id": 5, "subject": "Task 5: EquipmentNode DriverInstanceId/DeviceId/DeviceHost (E projection)", "status": "completed", "nativeId": 42, "commits": ["cb7ce7f1", "915492a7"]},
|
||||
{"id": 6, "subject": "Task 6: DriverHostActor cache-as-dict + driver-level resolution (E1)", "status": "completed", "blockedBy": [5], "nativeId": 43, "commits": ["adcd7b57"]},
|
||||
{"id": 7, "subject": "Task 7: Re-trigger discovery on rebind drop (C2)", "status": "completed", "blockedBy": [4, 6], "nativeId": 44, "commits": ["53367148", "cde16063"]},
|
||||
{"id": 8, "subject": "Task 8: Single SetDesiredSubscriptions per redeploy (D)", "status": "completed", "blockedBy": [7], "nativeId": 45, "commits": ["05c82079", "51721df5"]},
|
||||
{"id": 9, "subject": "Task 9: Multi-device-per-driver partition (E2)", "status": "completed", "blockedBy": [5, 8], "nativeId": 46, "commits": ["50f08635", "0074f37a"]},
|
||||
{"id": 10, "subject": "Task 10: Docs — follow-up notes + statuses", "status": "completed", "blockedBy": [9], "nativeId": 47},
|
||||
{"id": 11, "subject": "Task 11: Build + offline suite + regression gate", "status": "pending", "blockedBy": [2, 4, 9, 10], "nativeId": 48}
|
||||
{
|
||||
"id": 1,
|
||||
"subject": "Task 1: Injectable discovery timeout (A)",
|
||||
"status": "completed",
|
||||
"nativeId": 38,
|
||||
"commits": [
|
||||
"c2c368dc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"subject": "Task 2: RediscoverPolicy enum + driver overrides (B1)",
|
||||
"status": "completed",
|
||||
"nativeId": 39,
|
||||
"commits": [
|
||||
"a378b572",
|
||||
"efbdaf85"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"subject": "Task 3: DriverInstanceActor honors policy (B2)",
|
||||
"status": "completed",
|
||||
"blockedBy": [
|
||||
1,
|
||||
2
|
||||
],
|
||||
"nativeId": 40,
|
||||
"commits": [
|
||||
"ce34816a",
|
||||
"a1a655e6"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"subject": "Task 4: TriggerRediscovery message + handler (C1)",
|
||||
"status": "completed",
|
||||
"blockedBy": [
|
||||
3
|
||||
],
|
||||
"nativeId": 41,
|
||||
"commits": [
|
||||
"f7358bf4",
|
||||
"e7d5ebe9"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"subject": "Task 5: EquipmentNode DriverInstanceId/DeviceId/DeviceHost (E projection)",
|
||||
"status": "completed",
|
||||
"nativeId": 42,
|
||||
"commits": [
|
||||
"cb7ce7f1",
|
||||
"915492a7"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"subject": "Task 6: DriverHostActor cache-as-dict + driver-level resolution (E1)",
|
||||
"status": "completed",
|
||||
"blockedBy": [
|
||||
5
|
||||
],
|
||||
"nativeId": 43,
|
||||
"commits": [
|
||||
"adcd7b57"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"subject": "Task 7: Re-trigger discovery on rebind drop (C2)",
|
||||
"status": "completed",
|
||||
"blockedBy": [
|
||||
4,
|
||||
6
|
||||
],
|
||||
"nativeId": 44,
|
||||
"commits": [
|
||||
"53367148",
|
||||
"cde16063"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"subject": "Task 8: Single SetDesiredSubscriptions per redeploy (D)",
|
||||
"status": "completed",
|
||||
"blockedBy": [
|
||||
7
|
||||
],
|
||||
"nativeId": 45,
|
||||
"commits": [
|
||||
"05c82079",
|
||||
"51721df5"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"subject": "Task 9: Multi-device-per-driver partition (E2)",
|
||||
"status": "completed",
|
||||
"blockedBy": [
|
||||
5,
|
||||
8
|
||||
],
|
||||
"nativeId": 46,
|
||||
"commits": [
|
||||
"50f08635",
|
||||
"0074f37a"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": 10,
|
||||
"subject": "Task 10: Docs \u2014 follow-up notes + statuses",
|
||||
"status": "completed",
|
||||
"blockedBy": [
|
||||
9
|
||||
],
|
||||
"nativeId": 47
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"subject": "Task 11: Build + offline suite + regression gate",
|
||||
"status": "obsolete",
|
||||
"blockedBy": [
|
||||
2,
|
||||
4,
|
||||
9,
|
||||
10
|
||||
],
|
||||
"nativeId": 48,
|
||||
"note": "Closed 2026-08-10 as obsolete: the FixedTree-under-Equipment injection feature this gate verified was deleted wholesale when #507 closed as superseded (DiscoveredNodesReady, DiscoveredNodeMapper, HandleDiscoveredNodes, the connect-time discovery loop, and the 18 DiscoveryInjectionDormantV3 tests are all gone in v3). A verification gate for deleted code verifies nothing. ITagDiscovery itself lives on via the /raw browse picker (DiscoveryDriverBrowser), which has its own coverage."
|
||||
}
|
||||
],
|
||||
"nativeTaskIds": {
|
||||
"1": 38, "2": 39, "3": 40, "4": 41, "5": 42, "6": 43,
|
||||
"7": 44, "8": 45, "9": 46, "10": 47, "11": 48
|
||||
"1": 38,
|
||||
"2": 39,
|
||||
"3": 40,
|
||||
"4": 41,
|
||||
"5": 42,
|
||||
"6": 43,
|
||||
"7": 44,
|
||||
"8": 45,
|
||||
"9": 46,
|
||||
"10": 47,
|
||||
"11": 48
|
||||
},
|
||||
"lastUpdated": "2026-06-26T00:00:00Z",
|
||||
"status": "code+docs complete; final build/suite gate pending",
|
||||
"branch": "feat/focas-fixedtree-equipment-injection"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user