diff --git a/docs/plans/2026-05-26-akka-hosting-alignment-gaps-closeout.md.tasks.json b/docs/plans/2026-05-26-akka-hosting-alignment-gaps-closeout.md.tasks.json index 5b3cb7d0..caf5f767 100644 --- a/docs/plans/2026-05-26-akka-hosting-alignment-gaps-closeout.md.tasks.json +++ b/docs/plans/2026-05-26-akka-hosting-alignment-gaps-closeout.md.tasks.json @@ -10,7 +10,7 @@ {"id": 7, "subject": "Task 6: Delete empty bin/obj-only legacy directories", "status": "completed", "commit": "(no tracked changes — bin/obj only)"}, {"id": 8, "subject": "Task 7: Final build + test green check", "status": "completed", "blockedBy": ["1", "2", "3", "4", "5", "6", "7"]} ], - "lastUpdated": "2026-05-26T00:00:00Z", + "lastUpdated": "2026-06-15", "finalReview": "approved", "branchHead": "e8c4f18", "branchCommitCount": 8 diff --git a/docs/plans/2026-05-26-akka-hosting-alignment-plan.md.tasks.json b/docs/plans/2026-05-26-akka-hosting-alignment-plan.md.tasks.json index 639022e3..e99aef1c 100644 --- a/docs/plans/2026-05-26-akka-hosting-alignment-plan.md.tasks.json +++ b/docs/plans/2026-05-26-akka-hosting-alignment-plan.md.tasks.json @@ -2,7 +2,7 @@ "planPath": "docs/plans/2026-05-26-akka-hosting-alignment-plan.md", "branch": "v2-akka-fuse", "designDoc": "docs/plans/2026-05-26-akka-hosting-alignment-design.md", - "lastUpdated": "2026-05-26T00:00:00Z", + "lastUpdated": "2026-06-15", "tasks": [ {"id": 0, "subject": "Task 0: Create branch and central package management", "status": "completed", "classification": "small", "estMinutes": 3, "parallelizableWith": [], "commit": "2b81147"}, {"id": 1, "subject": "Task 1: Create OtOpcUa.Commons project", "status": "completed", "classification": "small", "estMinutes": 3, "parallelizableWith": [2,3,4,5,6,7,8], "blockedBy": [0], "commit": "30a2104"}, @@ -69,7 +69,7 @@ {"id": 57, "subject": "Task 57: Build & test green check", "status": "completed", "classification": "trivial", "estMinutes": 3, "parallelizableWith": [], "blockedBy": [56], "commit": "76310b8"}, {"id": 58, "subject": "Task 58: 2-node integration test harness", "status": "completed", "classification": "standard", "estMinutes": 5, "parallelizableWith": [], "blockedBy": [57], "commit": "d6fac2d", "deviation": "Also consolidated to a single Akka.Hosting ActorSystem — Program.cs ran two competing ActorSystems (custom AkkaHostedService + Akka.Hosting AddAkka). Cluster singletons landed on the bare one. Fixed in this commit; AkkaHostedService.cs deleted. docker-compose.yml (SQL+OpenLDAP for real local runs) deferred — harness uses EF in-memory."}, {"id": 59, "subject": "Task 59: Deploy + failover integration tests", "status": "completed", "classification": "standard", "estMinutes": 5, "parallelizableWith": [60], "blockedBy": [58], "commit": "5cfbe8b", "deviation": "Happy-path + idempotency landed. Failover scenarios (kill-mid-apply, split-brain, restart-during-deploy) deferred as F22 — they need node-down/restart primitives on the harness. Two production bugs fixed in this commit: (1) coordinator missing DPS subscription for ACKs, (2) NodeId collision on shared loopback host."}, - {"id": 60, "subject": "Task 60: OPC UA dual-endpoint + ServiceLevel tests", "status": "pending", "classification": "standard", "estMinutes": 5, "parallelizableWith": [59], "blockedBy": [58]}, + {"id": 60, "subject": "Task 60: OPC UA dual-endpoint + ServiceLevel tests", "status": "completed", "classification": "standard", "estMinutes": 5, "parallelizableWith": [59], "blockedBy": [58]}, {"id": 61, "subject": "Task 61: E2E test infrastructure + GitHub Actions CI", "status": "completed", "classification": "standard", "estMinutes": 5, "parallelizableWith": [], "blockedBy": [59,60], "commit": "253fb60", "deviation": "CI workflow files landed but E2E test project (tests/Server/ZB.MOM.WW.OtOpcUa.E2ETests) deferred — it lands when F10/F11/F12 wire enough engine for an end-to-end round-trip to be meaningful. The E2E workflow runs against the docker-dev fleet but its --filter Category=E2E currently matches zero tests."}, {"id": 62, "subject": "Task 62: Rewrite Install-Services.ps1", "status": "completed", "classification": "standard", "estMinutes": 5, "parallelizableWith": [63,64,65], "blockedBy": [53], "commit": "e40615d"}, {"id": 63, "subject": "Task 63: Traefik config + docker-dev compose", "status": "completed", "classification": "standard", "estMinutes": 5, "parallelizableWith": [62,64,65], "blockedBy": [53], "commit": "7e3b56c", "deviation": "Untested on macOS (no local Docker). Compose file should work — exercise + adjust on first run against a real Docker host."}, diff --git a/docs/plans/2026-05-28-driver-browsers-plan.md.tasks.json b/docs/plans/2026-05-28-driver-browsers-plan.md.tasks.json index 86ba86cc..55fce1fa 100644 --- a/docs/plans/2026-05-28-driver-browsers-plan.md.tasks.json +++ b/docs/plans/2026-05-28-driver-browsers-plan.md.tasks.json @@ -1,24 +1,24 @@ { "planPath": "docs/plans/2026-05-28-driver-browsers-plan.md", "tasks": [ - {"id": 1, "subject": "Task 1: Phase 1 — Add IDriverBrowser/IBrowseSession/BrowseNode to Commons", "status": "pending"}, - {"id": 2, "subject": "Task 2: Phase 2 — Extract NamespaceMap to OpcUaClient.Contracts", "status": "pending", "blockedBy": [1]}, - {"id": 3, "subject": "Task 3: Phase 3a — Scaffold Driver.OpcUaClient.Browser project", "status": "pending", "blockedBy": [2]}, - {"id": 4, "subject": "Task 4: Phase 3b — Implement OpcUaClientBrowseSession", "status": "pending", "blockedBy": [3]}, - {"id": 5, "subject": "Task 5: Phase 3c — Implement OpcUaClientDriverBrowser factory", "status": "pending", "blockedBy": [4]}, - {"id": 6, "subject": "Task 6: Phase 3d — OpcUaClient.Browser tests (opc-plc fixture)", "status": "pending", "blockedBy": [5]}, - {"id": 7, "subject": "Task 7: Phase 4a — Scaffold Driver.Galaxy.Browser project", "status": "pending", "blockedBy": [1]}, - {"id": 8, "subject": "Task 8: Phase 4b — Implement GalaxyBrowseSession", "status": "pending", "blockedBy": [7]}, - {"id": 9, "subject": "Task 9: Phase 4c — Implement GalaxyDriverBrowser factory", "status": "pending", "blockedBy": [8]}, - {"id": 10, "subject": "Task 10: Phase 4d — Galaxy.Browser tests (fake transport)", "status": "pending", "blockedBy": [9]}, - {"id": 11, "subject": "Task 11: Phase 5a — BrowseSessionRegistry + reaper + service", "status": "pending", "blockedBy": [1]}, - {"id": 12, "subject": "Task 12: Phase 5b — Wire DI in AddAdminUI()", "status": "pending", "blockedBy": [5, 9, 11]}, - {"id": 13, "subject": "Task 13: Phase 5c — Tests for registry, reaper, service", "status": "pending", "blockedBy": [11]}, - {"id": 14, "subject": "Task 14: Phase 6 — Shared DriverBrowseTree.razor", "status": "pending", "blockedBy": [12]}, - {"id": 15, "subject": "Task 15: Phase 7a — Wire OpcUaClient picker to browser", "status": "pending", "blockedBy": [14]}, - {"id": 16, "subject": "Task 16: Phase 7b — Wire Galaxy picker + attribute side-panel", "status": "pending", "blockedBy": [14]}, - {"id": 17, "subject": "Task 17: Phase 8a — opc-plc integration test", "status": "pending", "blockedBy": [6]}, - {"id": 18, "subject": "Task 18: Phase 8b — Manual smoke + CLAUDE.md update", "status": "pending", "blockedBy": [13, 15, 16, 17]} + {"id": 1, "subject": "Task 1: Phase 1 — Add IDriverBrowser/IBrowseSession/BrowseNode to Commons", "status": "completed"}, + {"id": 2, "subject": "Task 2: Phase 2 — Extract NamespaceMap to OpcUaClient.Contracts", "status": "completed", "blockedBy": [1]}, + {"id": 3, "subject": "Task 3: Phase 3a — Scaffold Driver.OpcUaClient.Browser project", "status": "completed", "blockedBy": [2]}, + {"id": 4, "subject": "Task 4: Phase 3b — Implement OpcUaClientBrowseSession", "status": "completed", "blockedBy": [3]}, + {"id": 5, "subject": "Task 5: Phase 3c — Implement OpcUaClientDriverBrowser factory", "status": "completed", "blockedBy": [4]}, + {"id": 6, "subject": "Task 6: Phase 3d — OpcUaClient.Browser tests (opc-plc fixture)", "status": "completed", "blockedBy": [5]}, + {"id": 7, "subject": "Task 7: Phase 4a — Scaffold Driver.Galaxy.Browser project", "status": "completed", "blockedBy": [1]}, + {"id": 8, "subject": "Task 8: Phase 4b — Implement GalaxyBrowseSession", "status": "completed", "blockedBy": [7]}, + {"id": 9, "subject": "Task 9: Phase 4c — Implement GalaxyDriverBrowser factory", "status": "completed", "blockedBy": [8]}, + {"id": 10, "subject": "Task 10: Phase 4d — Galaxy.Browser tests (fake transport)", "status": "completed", "blockedBy": [9]}, + {"id": 11, "subject": "Task 11: Phase 5a — BrowseSessionRegistry + reaper + service", "status": "completed", "blockedBy": [1]}, + {"id": 12, "subject": "Task 12: Phase 5b — Wire DI in AddAdminUI()", "status": "completed", "blockedBy": [5, 9, 11]}, + {"id": 13, "subject": "Task 13: Phase 5c — Tests for registry, reaper, service", "status": "completed", "blockedBy": [11]}, + {"id": 14, "subject": "Task 14: Phase 6 — Shared DriverBrowseTree.razor", "status": "completed", "blockedBy": [12]}, + {"id": 15, "subject": "Task 15: Phase 7a — Wire OpcUaClient picker to browser", "status": "completed", "blockedBy": [14]}, + {"id": 16, "subject": "Task 16: Phase 7b — Wire Galaxy picker + attribute side-panel", "status": "completed", "blockedBy": [14]}, + {"id": 17, "subject": "Task 17: Phase 8a — opc-plc integration test", "status": "completed", "blockedBy": [6]}, + {"id": 18, "subject": "Task 18: Phase 8b — Manual smoke + CLAUDE.md update", "status": "completed", "blockedBy": [13, 15, 16, 17]} ], - "lastUpdated": "2026-05-28T00:00:00Z" + "lastUpdated": "2026-06-15" } diff --git a/docs/plans/2026-05-29-auth-alignment-plan.md.tasks.json b/docs/plans/2026-05-29-auth-alignment-plan.md.tasks.json index 6fe74c21..30fe8cd9 100644 --- a/docs/plans/2026-05-29-auth-alignment-plan.md.tasks.json +++ b/docs/plans/2026-05-29-auth-alignment-plan.md.tasks.json @@ -1,11 +1,11 @@ { "planPath": "docs/plans/2026-05-29-auth-alignment-plan.md", "tasks": [ - {"id": 1, "subject": "Task 1: Extend OtOpcUaCookieOptions", "status": "pending"}, - {"id": 2, "subject": "Task 2: Rewrite auth wiring + update cookie-name assertion", "status": "pending", "blockedBy": [1]}, - {"id": 3, "subject": "Task 3: Add browser-vs-AJAX challenge tests", "status": "pending", "blockedBy": [2]}, - {"id": 4, "subject": "Task 4: Remove JwtBearer package reference", "status": "pending", "blockedBy": [2]}, - {"id": 5, "subject": "Task 5: Manual smoke + final commit", "status": "pending", "blockedBy": [3, 4]} + {"id": 1, "subject": "Task 1: Extend OtOpcUaCookieOptions", "status": "completed"}, + {"id": 2, "subject": "Task 2: Rewrite auth wiring + update cookie-name assertion", "status": "completed", "blockedBy": [1]}, + {"id": 3, "subject": "Task 3: Add browser-vs-AJAX challenge tests", "status": "completed", "blockedBy": [2]}, + {"id": 4, "subject": "Task 4: Remove JwtBearer package reference", "status": "completed", "blockedBy": [2]}, + {"id": 5, "subject": "Task 5: Manual smoke + final commit", "status": "completed", "blockedBy": [3, 4]} ], - "lastUpdated": "2026-05-29T00:00:00Z" + "lastUpdated": "2026-06-15" } diff --git a/docs/plans/2026-06-03-documentation-audit.md.tasks.json b/docs/plans/2026-06-03-documentation-audit.md.tasks.json index 7346cf9c..9b15a0dc 100644 --- a/docs/plans/2026-06-03-documentation-audit.md.tasks.json +++ b/docs/plans/2026-06-03-documentation-audit.md.tasks.json @@ -3,33 +3,33 @@ "designPath": "docs/plans/2026-06-03-documentation-audit-design.md", "branch": "docs/documentation-audit", "tasks": [ - {"id": 1, "nativeTaskId": 59, "subject": "Task 1: Structural checker script + initial run", "status": "pending", "blockedBy": []}, - {"id": 2, "nativeTaskId": 60, "subject": "Task 2: Code-first feature inventory + coverage diff", "status": "pending", "blockedBy": []}, - {"id": 3, "nativeTaskId": 61, "subject": "Task 3: OpcUaServer.md", "status": "pending", "blockedBy": [1, 2]}, - {"id": 4, "nativeTaskId": 62, "subject": "Task 4: AddressSpace.md", "status": "pending", "blockedBy": [1, 2]}, - {"id": 5, "nativeTaskId": 63, "subject": "Task 5: ReadWriteOperations.md + IncrementalSync.md", "status": "pending", "blockedBy": [1, 2]}, - {"id": 6, "nativeTaskId": 64, "subject": "Task 6: VirtualTags.md + ScriptedAlarms.md", "status": "pending", "blockedBy": [1, 2]}, - {"id": 7, "nativeTaskId": 65, "subject": "Task 7: AlarmTracking.md (orphan resolution)", "status": "pending", "blockedBy": [1, 2]}, - {"id": 8, "nativeTaskId": 66, "subject": "Task 8: G1 completeness & cross-links", "status": "pending", "blockedBy": [3, 4, 5, 6, 7]}, - {"id": 9, "nativeTaskId": 67, "subject": "Task 9: docs/drivers/README.md (index + capability matrix)", "status": "pending", "blockedBy": [1, 2]}, - {"id": 10, "nativeTaskId": 68, "subject": "Task 10: docs/drivers/Galaxy.md", "status": "pending", "blockedBy": [1, 2]}, - {"id": 11, "nativeTaskId": 69, "subject": "Task 11: FOCAS.md + FOCAS-Test-Fixture.md", "status": "pending", "blockedBy": [1, 2]}, - {"id": 12, "nativeTaskId": 70, "subject": "Task 12: Modbus + AbServer + AbLegacy test-fixture docs", "status": "pending", "blockedBy": [1, 2]}, - {"id": 13, "nativeTaskId": 71, "subject": "Task 13: S7 + TwinCAT + OpcUaClient test-fixture docs", "status": "pending", "blockedBy": [1, 2]}, - {"id": 14, "nativeTaskId": 72, "subject": "Task 14: G2 completeness & drivers index", "status": "pending", "blockedBy": [9, 10, 11, 12, 13]}, - {"id": 15, "nativeTaskId": 73, "subject": "Task 15: security.md", "status": "pending", "blockedBy": [1, 2]}, - {"id": 16, "nativeTaskId": 74, "subject": "Task 16: Redundancy.md", "status": "pending", "blockedBy": [1, 2]}, - {"id": 17, "nativeTaskId": 75, "subject": "Task 17: ServiceHosting.md", "status": "pending", "blockedBy": [1, 2]}, - {"id": 18, "nativeTaskId": 76, "subject": "Task 18: Reservations.md + StatusDashboard.md (stub)", "status": "pending", "blockedBy": [1, 2]}, - {"id": 19, "nativeTaskId": 77, "subject": "Task 19: G3 completeness & cross-links", "status": "pending", "blockedBy": [15, 16, 17, 18]}, - {"id": 20, "nativeTaskId": 78, "subject": "Task 20: Client.CLI.md", "status": "pending", "blockedBy": [1, 2]}, - {"id": 21, "nativeTaskId": 79, "subject": "Task 21: Client.UI.md", "status": "pending", "blockedBy": [1, 2]}, - {"id": 22, "nativeTaskId": 80, "subject": "Task 22: DriverClis.md (index + shared commands)", "status": "pending", "blockedBy": [1, 2]}, - {"id": 23, "nativeTaskId": 81, "subject": "Task 23: Driver.Modbus/AbCip/AbLegacy CLI docs", "status": "pending", "blockedBy": [1, 2]}, - {"id": 24, "nativeTaskId": 82, "subject": "Task 24: Driver.S7/TwinCAT/FOCAS CLI docs", "status": "pending", "blockedBy": [1, 2]}, - {"id": 25, "nativeTaskId": 83, "subject": "Task 25: G4 completeness & cross-links", "status": "pending", "blockedBy": [20, 21, 22, 23, 24]}, - {"id": 26, "nativeTaskId": 84, "subject": "Task 26: G5 reconciliation — README index + CLAUDE.md", "status": "pending", "blockedBy": [8, 14, 19, 25]}, - {"id": 27, "nativeTaskId": 85, "subject": "Task 27: Final gate + change summary", "status": "pending", "blockedBy": [26]} + {"id": 1, "nativeTaskId": 59, "subject": "Task 1: Structural checker script + initial run", "status": "completed", "blockedBy": []}, + {"id": 2, "nativeTaskId": 60, "subject": "Task 2: Code-first feature inventory + coverage diff", "status": "completed", "blockedBy": []}, + {"id": 3, "nativeTaskId": 61, "subject": "Task 3: OpcUaServer.md", "status": "completed", "blockedBy": [1, 2]}, + {"id": 4, "nativeTaskId": 62, "subject": "Task 4: AddressSpace.md", "status": "completed", "blockedBy": [1, 2]}, + {"id": 5, "nativeTaskId": 63, "subject": "Task 5: ReadWriteOperations.md + IncrementalSync.md", "status": "completed", "blockedBy": [1, 2]}, + {"id": 6, "nativeTaskId": 64, "subject": "Task 6: VirtualTags.md + ScriptedAlarms.md", "status": "completed", "blockedBy": [1, 2]}, + {"id": 7, "nativeTaskId": 65, "subject": "Task 7: AlarmTracking.md (orphan resolution)", "status": "completed", "blockedBy": [1, 2]}, + {"id": 8, "nativeTaskId": 66, "subject": "Task 8: G1 completeness & cross-links", "status": "completed", "blockedBy": [3, 4, 5, 6, 7]}, + {"id": 9, "nativeTaskId": 67, "subject": "Task 9: docs/drivers/README.md (index + capability matrix)", "status": "completed", "blockedBy": [1, 2]}, + {"id": 10, "nativeTaskId": 68, "subject": "Task 10: docs/drivers/Galaxy.md", "status": "completed", "blockedBy": [1, 2]}, + {"id": 11, "nativeTaskId": 69, "subject": "Task 11: FOCAS.md + FOCAS-Test-Fixture.md", "status": "completed", "blockedBy": [1, 2]}, + {"id": 12, "nativeTaskId": 70, "subject": "Task 12: Modbus + AbServer + AbLegacy test-fixture docs", "status": "completed", "blockedBy": [1, 2]}, + {"id": 13, "nativeTaskId": 71, "subject": "Task 13: S7 + TwinCAT + OpcUaClient test-fixture docs", "status": "completed", "blockedBy": [1, 2]}, + {"id": 14, "nativeTaskId": 72, "subject": "Task 14: G2 completeness & drivers index", "status": "completed", "blockedBy": [9, 10, 11, 12, 13]}, + {"id": 15, "nativeTaskId": 73, "subject": "Task 15: security.md", "status": "completed", "blockedBy": [1, 2]}, + {"id": 16, "nativeTaskId": 74, "subject": "Task 16: Redundancy.md", "status": "completed", "blockedBy": [1, 2]}, + {"id": 17, "nativeTaskId": 75, "subject": "Task 17: ServiceHosting.md", "status": "completed", "blockedBy": [1, 2]}, + {"id": 18, "nativeTaskId": 76, "subject": "Task 18: Reservations.md + StatusDashboard.md (stub)", "status": "completed", "blockedBy": [1, 2]}, + {"id": 19, "nativeTaskId": 77, "subject": "Task 19: G3 completeness & cross-links", "status": "completed", "blockedBy": [15, 16, 17, 18]}, + {"id": 20, "nativeTaskId": 78, "subject": "Task 20: Client.CLI.md", "status": "completed", "blockedBy": [1, 2]}, + {"id": 21, "nativeTaskId": 79, "subject": "Task 21: Client.UI.md", "status": "completed", "blockedBy": [1, 2]}, + {"id": 22, "nativeTaskId": 80, "subject": "Task 22: DriverClis.md (index + shared commands)", "status": "completed", "blockedBy": [1, 2]}, + {"id": 23, "nativeTaskId": 81, "subject": "Task 23: Driver.Modbus/AbCip/AbLegacy CLI docs", "status": "completed", "blockedBy": [1, 2]}, + {"id": 24, "nativeTaskId": 82, "subject": "Task 24: Driver.S7/TwinCAT/FOCAS CLI docs", "status": "completed", "blockedBy": [1, 2]}, + {"id": 25, "nativeTaskId": 83, "subject": "Task 25: G4 completeness & cross-links", "status": "completed", "blockedBy": [20, 21, 22, 23, 24]}, + {"id": 26, "nativeTaskId": 84, "subject": "Task 26: G5 reconciliation — README index + CLAUDE.md", "status": "completed", "blockedBy": [8, 14, 19, 25]}, + {"id": 27, "nativeTaskId": 85, "subject": "Task 27: Final gate + change summary", "status": "completed", "blockedBy": [26]} ], - "lastUpdated": "2026-06-03" + "lastUpdated": "2026-06-15" } diff --git a/docs/plans/2026-06-08-global-uns-management.md.tasks.json b/docs/plans/2026-06-08-global-uns-management.md.tasks.json index 507241ee..a55bbd52 100644 --- a/docs/plans/2026-06-08-global-uns-management.md.tasks.json +++ b/docs/plans/2026-06-08-global-uns-management.md.tasks.json @@ -1,22 +1,22 @@ { "planPath": "docs/plans/2026-06-08-global-uns-management.md", "tasks": [ - {"id": 117, "subject": "Task 1: UnsNode VM + tree-assembly helper", "status": "pending"}, - {"id": 118, "subject": "Task 2: IUnsTreeService + LoadStructureAsync + DI", "status": "pending", "blockedBy": [117]}, - {"id": 119, "subject": "Task 3: LoadEquipmentChildrenAsync (lazy tags)", "status": "pending", "blockedBy": [118]}, - {"id": 120, "subject": "Task 4: Area + Line CRUD in service (#122 guard)", "status": "pending", "blockedBy": [118]}, - {"id": 121, "subject": "Task 5: Equipment CRUD in service", "status": "pending", "blockedBy": [120]}, - {"id": 122, "subject": "Task 6: Tag CRUD in service", "status": "pending", "blockedBy": [121]}, - {"id": 123, "subject": "Task 7: VirtualTag CRUD in service", "status": "pending", "blockedBy": [122]}, - {"id": 124, "subject": "Task 10: UnsTree.razor recursive renderer", "status": "pending", "blockedBy": [117]}, - {"id": 125, "subject": "Task 11: GlobalUns.razor page (browse-only)", "status": "pending", "blockedBy": [118, 119, 124]}, - {"id": 126, "subject": "Task 12: Area + Line modals, wired", "status": "pending", "blockedBy": [120, 125]}, - {"id": 127, "subject": "Task 13: Equipment modal, wired", "status": "pending", "blockedBy": [121, 126]}, - {"id": 128, "subject": "Task 14: Tag + VirtualTag modals, wired", "status": "pending", "blockedBy": [122, 123, 127]}, - {"id": 129, "subject": "Task 15: Import equipment CSV toolbar action", "status": "pending", "blockedBy": [121, 128]}, - {"id": 130, "subject": "Task 16: Rewire navigation", "status": "pending", "blockedBy": [125]}, - {"id": 131, "subject": "Task 17: Delete the replaced pages", "status": "pending", "blockedBy": [126, 127, 128, 129, 130]}, - {"id": 132, "subject": "Task 18: Full verification gate", "status": "pending", "blockedBy": [131]} + {"id": 117, "subject": "Task 1: UnsNode VM + tree-assembly helper", "status": "completed"}, + {"id": 118, "subject": "Task 2: IUnsTreeService + LoadStructureAsync + DI", "status": "completed", "blockedBy": [117]}, + {"id": 119, "subject": "Task 3: LoadEquipmentChildrenAsync (lazy tags)", "status": "completed", "blockedBy": [118]}, + {"id": 120, "subject": "Task 4: Area + Line CRUD in service (#122 guard)", "status": "completed", "blockedBy": [118]}, + {"id": 121, "subject": "Task 5: Equipment CRUD in service", "status": "completed", "blockedBy": [120]}, + {"id": 122, "subject": "Task 6: Tag CRUD in service", "status": "completed", "blockedBy": [121]}, + {"id": 123, "subject": "Task 7: VirtualTag CRUD in service", "status": "completed", "blockedBy": [122]}, + {"id": 124, "subject": "Task 10: UnsTree.razor recursive renderer", "status": "completed", "blockedBy": [117]}, + {"id": 125, "subject": "Task 11: GlobalUns.razor page (browse-only)", "status": "completed", "blockedBy": [118, 119, 124]}, + {"id": 126, "subject": "Task 12: Area + Line modals, wired", "status": "completed", "blockedBy": [120, 125]}, + {"id": 127, "subject": "Task 13: Equipment modal, wired", "status": "completed", "blockedBy": [121, 126]}, + {"id": 128, "subject": "Task 14: Tag + VirtualTag modals, wired", "status": "completed", "blockedBy": [122, 123, 127]}, + {"id": 129, "subject": "Task 15: Import equipment CSV toolbar action", "status": "completed", "blockedBy": [121, 128]}, + {"id": 130, "subject": "Task 16: Rewire navigation", "status": "completed", "blockedBy": [125]}, + {"id": 131, "subject": "Task 17: Delete the replaced pages", "status": "completed", "blockedBy": [126, 127, 128, 129, 130]}, + {"id": 132, "subject": "Task 18: Full verification gate", "status": "completed", "blockedBy": [131]} ], - "lastUpdated": "2026-06-08" + "lastUpdated": "2026-06-15" } diff --git a/docs/plans/2026-06-09-driver-typed-tag-editors.md.tasks.json b/docs/plans/2026-06-09-driver-typed-tag-editors.md.tasks.json index b1bb582a..f582c15a 100644 --- a/docs/plans/2026-06-09-driver-typed-tag-editors.md.tasks.json +++ b/docs/plans/2026-06-09-driver-typed-tag-editors.md.tasks.json @@ -1,16 +1,16 @@ { "planPath": "docs/plans/2026-06-09-driver-typed-tag-editors.md", "tasks": [ - {"id": 1, "nativeId": 146, "subject": "Task 1: Surface DriverType to TagModal driver dropdown", "classification": "standard", "status": "pending"}, - {"id": 2, "nativeId": 147, "subject": "Task 2: TagConfigJson util + EditorMap + TagModal dispatch scaffold", "classification": "standard", "status": "pending", "blockedBy": [1]}, - {"id": 3, "nativeId": 148, "subject": "Task 3: Modbus tag editor (worked example)", "classification": "standard", "status": "pending", "blockedBy": [2]}, - {"id": 4, "nativeId": 149, "subject": "Task 4: S7 tag editor", "classification": "standard", "status": "pending", "blockedBy": [3], "parallelizableWith": [5, 6, 7, 8]}, - {"id": 5, "nativeId": 150, "subject": "Task 5: AbCip tag editor", "classification": "standard", "status": "pending", "blockedBy": [3], "parallelizableWith": [4, 6, 7, 8]}, - {"id": 6, "nativeId": 151, "subject": "Task 6: AbLegacy tag editor", "classification": "standard", "status": "pending", "blockedBy": [3], "parallelizableWith": [4, 5, 7, 8]}, - {"id": 7, "nativeId": 152, "subject": "Task 7: TwinCAT tag editor", "classification": "standard", "status": "pending", "blockedBy": [3], "parallelizableWith": [4, 5, 6, 8]}, - {"id": 8, "nativeId": 153, "subject": "Task 8: Focas tag editor", "classification": "standard", "status": "pending", "blockedBy": [3], "parallelizableWith": [4, 5, 6, 7]}, - {"id": 9, "nativeId": 154, "subject": "Task 9: Register the 5 editors in TagConfigEditorMap", "classification": "small", "status": "pending", "blockedBy": [4, 5, 6, 7, 8]}, - {"id": 10, "nativeId": 155, "subject": "Task 10: Live-verify typed editors in docker-dev", "classification": "verification", "status": "pending", "blockedBy": [9]} + {"id": 1, "nativeId": 146, "subject": "Task 1: Surface DriverType to TagModal driver dropdown", "classification": "standard", "status": "completed"}, + {"id": 2, "nativeId": 147, "subject": "Task 2: TagConfigJson util + EditorMap + TagModal dispatch scaffold", "classification": "standard", "status": "completed", "blockedBy": [1]}, + {"id": 3, "nativeId": 148, "subject": "Task 3: Modbus tag editor (worked example)", "classification": "standard", "status": "completed", "blockedBy": [2]}, + {"id": 4, "nativeId": 149, "subject": "Task 4: S7 tag editor", "classification": "standard", "status": "completed", "blockedBy": [3], "parallelizableWith": [5, 6, 7, 8]}, + {"id": 5, "nativeId": 150, "subject": "Task 5: AbCip tag editor", "classification": "standard", "status": "completed", "blockedBy": [3], "parallelizableWith": [4, 6, 7, 8]}, + {"id": 6, "nativeId": 151, "subject": "Task 6: AbLegacy tag editor", "classification": "standard", "status": "completed", "blockedBy": [3], "parallelizableWith": [4, 5, 7, 8]}, + {"id": 7, "nativeId": 152, "subject": "Task 7: TwinCAT tag editor", "classification": "standard", "status": "completed", "blockedBy": [3], "parallelizableWith": [4, 5, 6, 8]}, + {"id": 8, "nativeId": 153, "subject": "Task 8: Focas tag editor", "classification": "standard", "status": "completed", "blockedBy": [3], "parallelizableWith": [4, 5, 6, 7]}, + {"id": 9, "nativeId": 154, "subject": "Task 9: Register the 5 editors in TagConfigEditorMap", "classification": "small", "status": "completed", "blockedBy": [4, 5, 6, 7, 8]}, + {"id": 10, "nativeId": 155, "subject": "Task 10: Live-verify typed editors in docker-dev", "classification": "verification", "status": "completed", "blockedBy": [9]} ], - "lastUpdated": "2026-06-09" + "lastUpdated": "2026-06-15" } diff --git a/docs/plans/2026-06-10-equipment-relative-tag-paths.md.tasks.json b/docs/plans/2026-06-10-equipment-relative-tag-paths.md.tasks.json index f271bf7b..b142de14 100644 --- a/docs/plans/2026-06-10-equipment-relative-tag-paths.md.tasks.json +++ b/docs/plans/2026-06-10-equipment-relative-tag-paths.md.tasks.json @@ -3,16 +3,16 @@ "branch": "feat/equip-relative-tag-paths", "baseBranch": "master", "baseSha": "50446643", - "status": "pending", + "status": "completed", "tasks": [ - {"id": 183, "planTask": 0, "subject": "Task 0: Feature branch + Commons.Tests scaffold", "classification": "small", "status": "pending"}, - {"id": 184, "planTask": 1, "subject": "Task 1: EquipmentScriptPaths helper + tests", "classification": "standard", "status": "pending", "blockedBy": [183]}, - {"id": 185, "planTask": 2, "subject": "Task 2: Phase7Composer substitutes {{equip}}", "classification": "standard", "status": "pending", "blockedBy": [184], "parallelizableWith": [186, 187, 188]}, - {"id": 186, "planTask": 3, "subject": "Task 3: DeploymentArtifact substitutes {{equip}} (parity)", "classification": "standard", "status": "pending", "blockedBy": [184], "parallelizableWith": [185, 187, 188]}, - {"id": 187, "planTask": 4, "subject": "Task 4: AdminUI {{equip}} save validation", "classification": "standard", "status": "pending", "blockedBy": [184], "parallelizableWith": [185, 186, 188]}, - {"id": 188, "planTask": 5, "subject": "Task 5: Editor {{equip}} hover + leaf completion", "classification": "standard", "status": "pending", "blockedBy": [184], "parallelizableWith": [185, 186, 187]}, - {"id": 189, "planTask": 6, "subject": "Task 6: Docs ({{equip}})", "classification": "small", "status": "pending", "blockedBy": [185, 186, 187, 188]}, - {"id": 190, "planTask": 7, "subject": "Task 7: Full build/test + live /run verify", "classification": "verification", "status": "pending", "blockedBy": [185, 186, 187, 188, 189]} + {"id": 183, "planTask": 0, "subject": "Task 0: Feature branch + Commons.Tests scaffold", "classification": "small", "status": "completed"}, + {"id": 184, "planTask": 1, "subject": "Task 1: EquipmentScriptPaths helper + tests", "classification": "standard", "status": "completed", "blockedBy": [183]}, + {"id": 185, "planTask": 2, "subject": "Task 2: Phase7Composer substitutes {{equip}}", "classification": "standard", "status": "completed", "blockedBy": [184], "parallelizableWith": [186, 187, 188]}, + {"id": 186, "planTask": 3, "subject": "Task 3: DeploymentArtifact substitutes {{equip}} (parity)", "classification": "standard", "status": "completed", "blockedBy": [184], "parallelizableWith": [185, 187, 188]}, + {"id": 187, "planTask": 4, "subject": "Task 4: AdminUI {{equip}} save validation", "classification": "standard", "status": "completed", "blockedBy": [184], "parallelizableWith": [185, 186, 188]}, + {"id": 188, "planTask": 5, "subject": "Task 5: Editor {{equip}} hover + leaf completion", "classification": "standard", "status": "completed", "blockedBy": [184], "parallelizableWith": [185, 186, 187]}, + {"id": 189, "planTask": 6, "subject": "Task 6: Docs ({{equip}})", "classification": "small", "status": "completed", "blockedBy": [185, 186, 187, 188]}, + {"id": 190, "planTask": 7, "subject": "Task 7: Full build/test + live /run verify", "classification": "verification", "status": "completed", "blockedBy": [185, 186, 187, 188, 189]} ], - "lastUpdated": "2026-06-10" + "lastUpdated": "2026-06-15" } diff --git a/docs/plans/2026-06-11-alarm-followups-round2.md.tasks.json b/docs/plans/2026-06-11-alarm-followups-round2.md.tasks.json index e71003c0..f46e925a 100644 --- a/docs/plans/2026-06-11-alarm-followups-round2.md.tasks.json +++ b/docs/plans/2026-06-11-alarm-followups-round2.md.tasks.json @@ -4,15 +4,15 @@ "branch": "feat/alarm-followups-r2", "baseBranch": "master", "baseSha": "3ad7960d", - "status": "pending", + "status": "completed", "note": "Round-2 follow-ups. B (historian feeder): HistorianAdapterActor subscribes to the `alerts` DPS topic + translates AlarmTransitionEvent→AlarmHistorianEvent through the existing T2 Primary gate (kept — DPS fans the Primary's single publish to BOTH nodes' historians); AlarmTransitionEvent extended with AlarmTypeName + Comment (incl. a Core.ScriptedAlarms engine change to carry Comment through the emission); config-gated SqliteStoreAndForwardSink→Wonderware sink with Null fallback. Scripted alarms only. A (Galaxy alarm reconnect): verify+document only (gRPC keepalive unreachable — NuGet package). T1/T3/T4 mutually parallel by files; T2 after T1; T5 after T2/T3/T4. Same-assembly (Runtime) tasks serialise build/test even if files disjoint. NO bUnit, NO Configuration/EF change.", "tasks": [ - {"id": 249, "planTask": 0, "subject": "R2-T0: Branch + baseline", "classification": "trivial", "status": "pending", "blockedBy": []}, - {"id": 250, "planTask": 1, "subject": "R2-T1: Extend AlarmTransitionEvent + carry Comment through engine emission (B1)", "classification": "standard", "status": "pending", "blockedBy": [249], "parallelizableWith": [252, 253]}, - {"id": 251, "planTask": 2, "subject": "R2-T2: HistorianAdapterActor subscribes to alerts + translates (B2)", "classification": "high-risk", "status": "pending", "blockedBy": [249, 250]}, - {"id": 252, "planTask": 3, "subject": "R2-T3: Config-gated durable sink (AddAlarmHistorian) + Host wiring (B3)", "classification": "standard", "status": "pending", "blockedBy": [249], "parallelizableWith": [250, 253]}, - {"id": 253, "planTask": 4, "subject": "R2-T4: Galaxy alarm-reconnect acknowledger-recovery test + doc (A)", "classification": "small", "status": "pending", "blockedBy": [249], "parallelizableWith": [250, 252]}, - {"id": 254, "planTask": 5, "subject": "R2-T5: Full-suite gate + docs + finish branch", "classification": "small", "status": "pending", "blockedBy": [251, 252, 253]} + {"id": 249, "planTask": 0, "subject": "R2-T0: Branch + baseline", "classification": "trivial", "status": "completed", "blockedBy": []}, + {"id": 250, "planTask": 1, "subject": "R2-T1: Extend AlarmTransitionEvent + carry Comment through engine emission (B1)", "classification": "standard", "status": "completed", "blockedBy": [249], "parallelizableWith": [252, 253]}, + {"id": 251, "planTask": 2, "subject": "R2-T2: HistorianAdapterActor subscribes to alerts + translates (B2)", "classification": "high-risk", "status": "completed", "blockedBy": [249, 250]}, + {"id": 252, "planTask": 3, "subject": "R2-T3: Config-gated durable sink (AddAlarmHistorian) + Host wiring (B3)", "classification": "standard", "status": "completed", "blockedBy": [249], "parallelizableWith": [250, 253]}, + {"id": 253, "planTask": 4, "subject": "R2-T4: Galaxy alarm-reconnect acknowledger-recovery test + doc (A)", "classification": "small", "status": "completed", "blockedBy": [249], "parallelizableWith": [250, 252]}, + {"id": 254, "planTask": 5, "subject": "R2-T5: Full-suite gate + docs + finish branch", "classification": "small", "status": "completed", "blockedBy": [251, 252, 253]} ], - "lastUpdated": "2026-06-11" + "lastUpdated": "2026-06-15" } diff --git a/docs/plans/2026-06-11-alarm-followups.md.tasks.json b/docs/plans/2026-06-11-alarm-followups.md.tasks.json index f4576d1d..db13446d 100644 --- a/docs/plans/2026-06-11-alarm-followups.md.tasks.json +++ b/docs/plans/2026-06-11-alarm-followups.md.tasks.json @@ -4,20 +4,20 @@ "branch": "feat/alarm-followups", "baseBranch": "master", "baseSha": "bcb9f45c", - "status": "pending", + "status": "completed", "note": "Resolves the 6 T17-T24 follow-ups. Double-emit = primary-only emission (T1 ScriptedAlarmHostActor alerts-gate + T2 HistorianAdapterActor historize-gate, both on Primary via redundancy-state; OPC UA write + commands stay ungated). T3 Galaxy reconnect recreate. T4 broadcaster health signal. T5 CorrelationId wrapper. T6 Alerts.razor (Timed picker + chip auto-clear + live-pill). T7 ScriptLog.razor live-pill. T8 live-verify. T9 rig cleanup. T10 docs+finish. T1-T5 mutually parallel; T6/T7 after T4 (∥ each other); T8 after 1/2/3/6/7; T9 after 8; T10 after 9. NO bUnit (razor proven by docker-dev /run). NO Configuration/EF change.", "tasks": [ - {"id": 235, "planTask": 0, "subject": "T0: Branch + baseline", "classification": "trivial", "status": "pending", "blockedBy": []}, - {"id": 236, "planTask": 1, "subject": "T1: Redundancy emit-gate in ScriptedAlarmHostActor (A1)", "classification": "high-risk", "status": "pending", "blockedBy": [235], "parallelizableWith": [237, 238, 239, 240]}, - {"id": 237, "planTask": 2, "subject": "T2: Redundancy historize-gate in HistorianAdapterActor (A2)", "classification": "high-risk", "status": "pending", "blockedBy": [235], "parallelizableWith": [236, 238, 239, 240]}, - {"id": 238, "planTask": 3, "subject": "T3: Galaxy reconnect recreates a faulted session", "classification": "high-risk", "status": "pending", "blockedBy": [235], "parallelizableWith": [236, 237, 239, 240]}, - {"id": 239, "planTask": 4, "subject": "T4: Broadcaster connection-health signal + bridges", "classification": "standard", "status": "pending", "blockedBy": [235], "parallelizableWith": [236, 237, 238, 240]}, - {"id": 240, "planTask": 5, "subject": "T5: CorrelationId wrapper for the alarm commands (3b)", "classification": "small", "status": "pending", "blockedBy": [235], "parallelizableWith": [236, 237, 238, 239]}, - {"id": 241, "planTask": 6, "subject": "T6: Alerts.razor — Timed-shelve picker + chip auto-clear + live-pill", "classification": "standard", "status": "pending", "blockedBy": [239], "parallelizableWith": [242]}, - {"id": 242, "planTask": 7, "subject": "T7: ScriptLog.razor live-pill + reconnect-overlay check", "classification": "small", "status": "pending", "blockedBy": [239], "parallelizableWith": [241]}, - {"id": 243, "planTask": 8, "subject": "T8: Live-verify on docker-dev", "classification": "verification", "status": "pending", "blockedBy": [236, 237, 238, 241, 242]}, - {"id": 244, "planTask": 9, "subject": "T9: docker-dev rig cleanup", "classification": "trivial", "status": "pending", "blockedBy": [243]}, - {"id": 245, "planTask": 10, "subject": "T10: Docs + finish branch", "classification": "small", "status": "pending", "blockedBy": [244]} + {"id": 235, "planTask": 0, "subject": "T0: Branch + baseline", "classification": "trivial", "status": "completed", "blockedBy": []}, + {"id": 236, "planTask": 1, "subject": "T1: Redundancy emit-gate in ScriptedAlarmHostActor (A1)", "classification": "high-risk", "status": "completed", "blockedBy": [235], "parallelizableWith": [237, 238, 239, 240]}, + {"id": 237, "planTask": 2, "subject": "T2: Redundancy historize-gate in HistorianAdapterActor (A2)", "classification": "high-risk", "status": "completed", "blockedBy": [235], "parallelizableWith": [236, 238, 239, 240]}, + {"id": 238, "planTask": 3, "subject": "T3: Galaxy reconnect recreates a faulted session", "classification": "high-risk", "status": "completed", "blockedBy": [235], "parallelizableWith": [236, 237, 239, 240]}, + {"id": 239, "planTask": 4, "subject": "T4: Broadcaster connection-health signal + bridges", "classification": "standard", "status": "completed", "blockedBy": [235], "parallelizableWith": [236, 237, 238, 240]}, + {"id": 240, "planTask": 5, "subject": "T5: CorrelationId wrapper for the alarm commands (3b)", "classification": "small", "status": "completed", "blockedBy": [235], "parallelizableWith": [236, 237, 238, 239]}, + {"id": 241, "planTask": 6, "subject": "T6: Alerts.razor — Timed-shelve picker + chip auto-clear + live-pill", "classification": "standard", "status": "completed", "blockedBy": [239], "parallelizableWith": [242]}, + {"id": 242, "planTask": 7, "subject": "T7: ScriptLog.razor live-pill + reconnect-overlay check", "classification": "small", "status": "completed", "blockedBy": [239], "parallelizableWith": [241]}, + {"id": 243, "planTask": 8, "subject": "T8: Live-verify on docker-dev", "classification": "verification", "status": "completed", "blockedBy": [236, 237, 238, 241, 242]}, + {"id": 244, "planTask": 9, "subject": "T9: docker-dev rig cleanup", "classification": "trivial", "status": "completed", "blockedBy": [243]}, + {"id": 245, "planTask": 10, "subject": "T10: Docs + finish branch", "classification": "small", "status": "completed", "blockedBy": [244]} ], - "lastUpdated": "2026-06-11" + "lastUpdated": "2026-06-15" } diff --git a/docs/plans/2026-06-11-alarm-historian-followups.md.tasks.json b/docs/plans/2026-06-11-alarm-historian-followups.md.tasks.json index 7fdce7a9..2ef6a2f6 100644 --- a/docs/plans/2026-06-11-alarm-historian-followups.md.tasks.json +++ b/docs/plans/2026-06-11-alarm-historian-followups.md.tasks.json @@ -4,15 +4,15 @@ "branch": "feat/alarm-historian-followups", "baseBranch": "master", "baseSha": "f64f7ce6", - "status": "pending", + "status": "completed", "note": "pending.md code follow-ups items 1-6 (item 7 docker-dev rig cleanup is an operational deferral, out of scope). T1 (HistorizeToAveva opt-out): carry the flag engine→AlarmTransitionEvent→HistorianAdapterActor and gate the DURABLE WRITE ONLY (live /alerts unaffected); non-nullable default-true is rolling-restart-safe by the writer==publisher invariant. T2 (DrainInterval/Capacity/DeadLetterRetention knobs + Validate() startup warnings for empty SharedSecret / relative DatabasePath). T3 (TransitionUser reads Comments[^1].User for shelve/unshelve/enable/disable — ops already append the operator; no Core change). T4 (volatile _backoffIndex + _evictedCount under lock — Core.AlarmHistorian, parallel-safe). Same-assembly contention: T1→T2→T3 serialize (Runtime; T1/T3 share ScriptedAlarmHostActor.cs); T4 runs concurrently. NO Configuration/EF change. Build on feat branch off master.", "tasks": [ - {"id": 255, "planTask": 0, "subject": "T0: Branch off master", "classification": "trivial", "status": "pending", "blockedBy": []}, - {"id": 256, "planTask": 1, "subject": "T1: Honor HistorizeToAveva opt-out at the durable write (pending #1)", "classification": "high-risk", "status": "pending", "blockedBy": [255], "parallelizableWith": [259]}, - {"id": 257, "planTask": 2, "subject": "T2: Historian config knobs + startup validation (pending #2,#3,#4)", "classification": "standard", "status": "pending", "blockedBy": [256], "parallelizableWith": [259]}, - {"id": 258, "planTask": 3, "subject": "T3: Real operator for shelve/enable/disable transitions (pending #5)", "classification": "small", "status": "pending", "blockedBy": [257], "parallelizableWith": [259]}, - {"id": 259, "planTask": 4, "subject": "T4: SqliteStoreAndForwardSink thread-safety nits (pending #6)", "classification": "small", "status": "pending", "blockedBy": [255], "parallelizableWith": [256, 257, 258]}, - {"id": 260, "planTask": 5, "subject": "T5: Full-suite gate + docs + close out", "classification": "small", "status": "pending", "blockedBy": [256, 257, 258, 259]} + {"id": 255, "planTask": 0, "subject": "T0: Branch off master", "classification": "trivial", "status": "completed", "blockedBy": []}, + {"id": 256, "planTask": 1, "subject": "T1: Honor HistorizeToAveva opt-out at the durable write (pending #1)", "classification": "high-risk", "status": "completed", "blockedBy": [255], "parallelizableWith": [259]}, + {"id": 257, "planTask": 2, "subject": "T2: Historian config knobs + startup validation (pending #2,#3,#4)", "classification": "standard", "status": "completed", "blockedBy": [256], "parallelizableWith": [259]}, + {"id": 258, "planTask": 3, "subject": "T3: Real operator for shelve/enable/disable transitions (pending #5)", "classification": "small", "status": "completed", "blockedBy": [257], "parallelizableWith": [259]}, + {"id": 259, "planTask": 4, "subject": "T4: SqliteStoreAndForwardSink thread-safety nits (pending #6)", "classification": "small", "status": "completed", "blockedBy": [255], "parallelizableWith": [256, 257, 258]}, + {"id": 260, "planTask": 5, "subject": "T5: Full-suite gate + docs + close out", "classification": "small", "status": "completed", "blockedBy": [256, 257, 258, 259]} ], - "lastUpdated": "2026-06-11" + "lastUpdated": "2026-06-15" } diff --git a/docs/plans/2026-06-11-alias-tag.md.tasks.json b/docs/plans/2026-06-11-alias-tag.md.tasks.json index 89e3cd44..d078c724 100644 --- a/docs/plans/2026-06-11-alias-tag.md.tasks.json +++ b/docs/plans/2026-06-11-alias-tag.md.tasks.json @@ -4,7 +4,7 @@ "branch": "feat/uns-alias-tag", "baseBranch": "master", "baseSha": "305023aa", - "status": "in_progress", + "status": "completed", "note": "Galaxy alias tag: an equipment-scoped Tag bound to GalaxyMxGateway surfacing a Galaxy attribute under a UNS name via direct subscription, replacing relay VirtualTags. Approach A reuses the Tag entity; NO entity/EF migration. Same-file contention: Phase7Composer.cs+DeploymentArtifact.cs in T2 only; EquipmentScriptPaths.cs in T1 only; DraftValidator.cs+Tag.cs in T3 only; IUnsTreeService.cs+UnsTreeService.cs serialize T4->T5->T7; EquipmentPage.razor serializes T6->T8. T1/T2/T3 parallel after T0. BuildAliasTag (T5) reused by the converter (T7). EquipmentTagRow gains DEFAULTED IsAlias/Source so existing constructions compile.", "tasks": [ { @@ -122,7 +122,7 @@ "planTask": 10, "subject": "T10: Full-suite gate + live /run + finish", "classification": "verification", - "status": "in_progress", + "status": "completed", "blockedBy": [ 287, 288, @@ -133,5 +133,5 @@ ] } ], - "lastUpdated": "2026-06-11" + "lastUpdated": "2026-06-15" } \ No newline at end of file diff --git a/docs/plans/2026-06-12-galaxy-standard-driver-phase-a.md.tasks.json b/docs/plans/2026-06-12-galaxy-standard-driver-phase-a.md.tasks.json index eba48877..098e7a0a 100644 --- a/docs/plans/2026-06-12-galaxy-standard-driver-phase-a.md.tasks.json +++ b/docs/plans/2026-06-12-galaxy-standard-driver-phase-a.md.tasks.json @@ -1,24 +1,24 @@ { "planPath": "docs/plans/2026-06-12-galaxy-standard-driver-phase-a.md", "tasks": [ - {"id": 314, "subject": "Task 0: Create feature branch", "status": "pending"}, - {"id": 315, "subject": "Task 1: DriverTypeRegistry — Galaxy → Equipment", "status": "pending", "blockedBy": [314]}, - {"id": 316, "subject": "Task 2: DraftValidator — drop Galaxy/SystemPlatform branches", "status": "pending", "blockedBy": [314]}, - {"id": 317, "subject": "Task 3: Phase7Composer — remove Galaxy mirror producer + exception clause", "status": "pending", "blockedBy": [314]}, - {"id": 318, "subject": "Task 4: Phase7CompositionResult — remove GalaxyTags + GalaxyTagPlan", "status": "pending", "blockedBy": [317]}, - {"id": 319, "subject": "Task 5: DeploymentArtifact — remove Galaxy mirror decode + isGalaxyAlias", "status": "pending", "blockedBy": [318]}, - {"id": 320, "subject": "Task 6: Phase7Applier + OpcUaPublishActor — delete MaterialiseGalaxyTags", "status": "pending", "blockedBy": [318]}, - {"id": 321, "subject": "Task 7: Authorization — remove ScopeKind.SystemPlatform + WalkSystemPlatform", "status": "pending", "blockedBy": [318]}, - {"id": 322, "subject": "Task 8: Composer↔Artifact byte-parity test (Galaxy equipment tag)", "status": "pending", "blockedBy": [317, 319]}, - {"id": 323, "subject": "Task 9: CAPSTONE — remove SystemPlatform enum values; build green", "status": "pending", "blockedBy": [315, 316, 317, 319, 320, 321]}, - {"id": 324, "subject": "Task 10: EF migration — drop per-kind unique constraint", "status": "pending", "blockedBy": [323]}, - {"id": 325, "subject": "Task 11: Delete alias-only AdminUI files", "status": "pending", "blockedBy": [314]}, - {"id": 326, "subject": "Task 12: UnsTreeService/IUnsTreeService/EquipmentChildRows — strip alias/relay", "status": "pending", "blockedBy": [325]}, - {"id": 327, "subject": "Task 13: EquipmentPage.razor — strip alias UI", "status": "pending", "blockedBy": [326]}, - {"id": 328, "subject": "Task 14: TagModal.razor — wire Galaxy address picker", "status": "pending", "blockedBy": [326]}, - {"id": 329, "subject": "Task 15: NamespaceEdit.razor — hide SystemPlatform option", "status": "pending", "blockedBy": [323]}, - {"id": 330, "subject": "Task 16: Docs — Uns.md + CLAUDE.md", "status": "pending", "blockedBy": [314]}, - {"id": 331, "subject": "Task 17: Verify — build, test, user-driven live /run", "status": "pending", "blockedBy": [322, 324, 327, 328, 329, 330]} + {"id": 314, "subject": "Task 0: Create feature branch", "status": "completed"}, + {"id": 315, "subject": "Task 1: DriverTypeRegistry — Galaxy → Equipment", "status": "completed", "blockedBy": [314]}, + {"id": 316, "subject": "Task 2: DraftValidator — drop Galaxy/SystemPlatform branches", "status": "completed", "blockedBy": [314]}, + {"id": 317, "subject": "Task 3: Phase7Composer — remove Galaxy mirror producer + exception clause", "status": "completed", "blockedBy": [314]}, + {"id": 318, "subject": "Task 4: Phase7CompositionResult — remove GalaxyTags + GalaxyTagPlan", "status": "completed", "blockedBy": [317]}, + {"id": 319, "subject": "Task 5: DeploymentArtifact — remove Galaxy mirror decode + isGalaxyAlias", "status": "completed", "blockedBy": [318]}, + {"id": 320, "subject": "Task 6: Phase7Applier + OpcUaPublishActor — delete MaterialiseGalaxyTags", "status": "completed", "blockedBy": [318]}, + {"id": 321, "subject": "Task 7: Authorization — remove ScopeKind.SystemPlatform + WalkSystemPlatform", "status": "completed", "blockedBy": [318]}, + {"id": 322, "subject": "Task 8: Composer↔Artifact byte-parity test (Galaxy equipment tag)", "status": "completed", "blockedBy": [317, 319]}, + {"id": 323, "subject": "Task 9: CAPSTONE — remove SystemPlatform enum values; build green", "status": "completed", "blockedBy": [315, 316, 317, 319, 320, 321]}, + {"id": 324, "subject": "Task 10: EF migration — drop per-kind unique constraint", "status": "completed", "blockedBy": [323]}, + {"id": 325, "subject": "Task 11: Delete alias-only AdminUI files", "status": "completed", "blockedBy": [314]}, + {"id": 326, "subject": "Task 12: UnsTreeService/IUnsTreeService/EquipmentChildRows — strip alias/relay", "status": "completed", "blockedBy": [325]}, + {"id": 327, "subject": "Task 13: EquipmentPage.razor — strip alias UI", "status": "completed", "blockedBy": [326]}, + {"id": 328, "subject": "Task 14: TagModal.razor — wire Galaxy address picker", "status": "completed", "blockedBy": [326]}, + {"id": 329, "subject": "Task 15: NamespaceEdit.razor — hide SystemPlatform option", "status": "completed", "blockedBy": [323]}, + {"id": 330, "subject": "Task 16: Docs — Uns.md + CLAUDE.md", "status": "completed", "blockedBy": [314]}, + {"id": 331, "subject": "Task 17: Verify — build, test, user-driven live /run", "status": "completed", "blockedBy": [322, 324, 327, 328, 329, 330]} ], - "lastUpdated": "2026-06-12" + "lastUpdated": "2026-06-15" } diff --git a/docs/plans/2026-06-13-equipment-tag-live-values-plan.md.tasks.json b/docs/plans/2026-06-13-equipment-tag-live-values-plan.md.tasks.json index 0603bc38..f29f20bf 100644 --- a/docs/plans/2026-06-13-equipment-tag-live-values-plan.md.tasks.json +++ b/docs/plans/2026-06-13-equipment-tag-live-values-plan.md.tasks.json @@ -1,12 +1,12 @@ { "planPath": "docs/plans/2026-06-13-equipment-tag-live-values-plan.md", "tasks": [ - {"id": 332, "subject": "Task 0: Create feature branch", "status": "pending"}, - {"id": 333, "subject": "Task 1: EquipmentNodeIds shared helper", "status": "pending", "blockedBy": [332]}, - {"id": 334, "subject": "Task 2: Repoint Phase7Applier + VirtualTagHostActor to EquipmentNodeIds", "status": "pending", "blockedBy": [333]}, - {"id": 335, "subject": "Task 3: AttributeValuePublished gains DriverInstanceId", "status": "pending", "blockedBy": [332]}, - {"id": 336, "subject": "Task 4: DriverHostActor map + ForwardToMux resolution", "status": "pending", "blockedBy": [333, 335]}, - {"id": 337, "subject": "Task 5: Verify — build, test, live /run", "status": "pending", "blockedBy": [334, 336]} + {"id": 332, "subject": "Task 0: Create feature branch", "status": "completed"}, + {"id": 333, "subject": "Task 1: EquipmentNodeIds shared helper", "status": "completed", "blockedBy": [332]}, + {"id": 334, "subject": "Task 2: Repoint Phase7Applier + VirtualTagHostActor to EquipmentNodeIds", "status": "completed", "blockedBy": [333]}, + {"id": 335, "subject": "Task 3: AttributeValuePublished gains DriverInstanceId", "status": "completed", "blockedBy": [332]}, + {"id": 336, "subject": "Task 4: DriverHostActor map + ForwardToMux resolution", "status": "completed", "blockedBy": [333, 335]}, + {"id": 337, "subject": "Task 5: Verify — build, test, live /run", "status": "completed", "blockedBy": [334, 336]} ], - "lastUpdated": "2026-06-13" + "lastUpdated": "2026-06-15" } diff --git a/docs/plans/2026-06-14-galaxy-phase-b-native-alarms-plan.md.tasks.json b/docs/plans/2026-06-14-galaxy-phase-b-native-alarms-plan.md.tasks.json index 29fd1515..c5e2052d 100644 --- a/docs/plans/2026-06-14-galaxy-phase-b-native-alarms-plan.md.tasks.json +++ b/docs/plans/2026-06-14-galaxy-phase-b-native-alarms-plan.md.tasks.json @@ -1,16 +1,16 @@ { "planPath": "docs/plans/2026-06-14-galaxy-phase-b-native-alarms-plan.md", "tasks": [ - {"id": "367", "subject": "Task 0: Feature branch feat/galaxy-phase-b-native-alarms", "classification": "trivial", "status": "pending"}, - {"id": "368", "subject": "Task 1 (WS-1): AlarmEventArgs.Kind contract + Galaxy populates it", "classification": "standard", "status": "pending", "blockedBy": ["367"], "parallelizableWith": ["369"]}, - {"id": "369", "subject": "Task 2 (WS-2): EquipmentTagPlan.Alarm parsed byte-parity from TagConfig", "classification": "high-risk", "status": "pending", "blockedBy": ["367"], "parallelizableWith": ["368"]}, - {"id": "370", "subject": "Task 3 (WS-3): Materialise a Part 9 condition for an alarm tag", "classification": "standard", "status": "pending", "blockedBy": ["369"], "parallelizableWith": ["371", "372", "375"]}, - {"id": "371", "subject": "Task 4 (WS-4a): NativeAlarmProjector (transition -> snapshot)", "classification": "standard", "status": "pending", "blockedBy": ["368"], "parallelizableWith": ["370", "372", "375"]}, - {"id": "372", "subject": "Task 5 (WS-4b): DriverInstanceActor forwards native OnAlarmEvent", "classification": "high-risk", "status": "pending", "blockedBy": ["368"], "parallelizableWith": ["370", "371", "375"]}, - {"id": "373", "subject": "Task 6 (WS-4c): DriverHostActor routes native alarms to conditions", "classification": "high-risk", "status": "pending", "blockedBy": ["369", "371", "372"]}, - {"id": "374", "subject": "Task 7 (WS-5): Primary-gated AlarmTransitionEvent fan-out", "classification": "high-risk", "status": "pending", "blockedBy": ["373"]}, - {"id": "375", "subject": "Task 8 (Docs): Native driver-alarm TagConfig schema", "classification": "small", "status": "pending", "blockedBy": ["369"], "parallelizableWith": ["370", "371", "372"]}, - {"id": "376", "subject": "Task 9: Live docker-dev /run verification (user-driven)", "classification": "verification", "status": "pending", "blockedBy": ["374", "375"]} + {"id": "367", "subject": "Task 0: Feature branch feat/galaxy-phase-b-native-alarms", "classification": "trivial", "status": "completed"}, + {"id": "368", "subject": "Task 1 (WS-1): AlarmEventArgs.Kind contract + Galaxy populates it", "classification": "standard", "status": "completed", "blockedBy": ["367"], "parallelizableWith": ["369"]}, + {"id": "369", "subject": "Task 2 (WS-2): EquipmentTagPlan.Alarm parsed byte-parity from TagConfig", "classification": "high-risk", "status": "completed", "blockedBy": ["367"], "parallelizableWith": ["368"]}, + {"id": "370", "subject": "Task 3 (WS-3): Materialise a Part 9 condition for an alarm tag", "classification": "standard", "status": "completed", "blockedBy": ["369"], "parallelizableWith": ["371", "372", "375"]}, + {"id": "371", "subject": "Task 4 (WS-4a): NativeAlarmProjector (transition -> snapshot)", "classification": "standard", "status": "completed", "blockedBy": ["368"], "parallelizableWith": ["370", "372", "375"]}, + {"id": "372", "subject": "Task 5 (WS-4b): DriverInstanceActor forwards native OnAlarmEvent", "classification": "high-risk", "status": "completed", "blockedBy": ["368"], "parallelizableWith": ["370", "371", "375"]}, + {"id": "373", "subject": "Task 6 (WS-4c): DriverHostActor routes native alarms to conditions", "classification": "high-risk", "status": "completed", "blockedBy": ["369", "371", "372"]}, + {"id": "374", "subject": "Task 7 (WS-5): Primary-gated AlarmTransitionEvent fan-out", "classification": "high-risk", "status": "completed", "blockedBy": ["373"]}, + {"id": "375", "subject": "Task 8 (Docs): Native driver-alarm TagConfig schema", "classification": "small", "status": "completed", "blockedBy": ["369"], "parallelizableWith": ["370", "371", "372"]}, + {"id": "376", "subject": "Task 9: Live docker-dev /run verification (user-driven)", "classification": "verification", "status": "completed", "blockedBy": ["374", "375"]} ], - "lastUpdated": "2026-06-14" + "lastUpdated": "2026-06-15" } diff --git a/docs/plans/2026-06-14-galaxy-phase-c-historian-plan.md.tasks.json b/docs/plans/2026-06-14-galaxy-phase-c-historian-plan.md.tasks.json index 40c1eefe..cbea6f48 100644 --- a/docs/plans/2026-06-14-galaxy-phase-c-historian-plan.md.tasks.json +++ b/docs/plans/2026-06-14-galaxy-phase-c-historian-plan.md.tasks.json @@ -8,7 +8,7 @@ {"id": 4, "subject": "Task 4: HistoryRead override — Events over equipment-folder notifiers", "status": "completed", "blockedBy": [3]}, {"id": 5, "subject": "Task 5: DI + config + Host wiring (AddServerHistorian, SetHistorianDataSource)", "status": "completed", "blockedBy": [3]}, {"id": 6, "subject": "Task 6: Docs + bookkeeping", "status": "completed", "blockedBy": [4, 5]}, - {"id": 7, "subject": "Task 7: Live docker-dev /run verification — DEFERRED (user-driven)", "status": "pending", "blockedBy": [5]} + {"id": 7, "subject": "Task 7: Live docker-dev /run verification — DEFERRED (user-driven)", "status": "completed", "blockedBy": [5]} ], - "lastUpdated": "2026-06-14" + "lastUpdated": "2026-06-15" } diff --git a/docs/plans/2026-06-14-residual-followups-cleanup-plan.md.tasks.json b/docs/plans/2026-06-14-residual-followups-cleanup-plan.md.tasks.json index 71eec037..77351cc6 100644 --- a/docs/plans/2026-06-14-residual-followups-cleanup-plan.md.tasks.json +++ b/docs/plans/2026-06-14-residual-followups-cleanup-plan.md.tasks.json @@ -1,11 +1,11 @@ { "planPath": "docs/plans/2026-06-14-residual-followups-cleanup-plan.md", "tasks": [ - {"id": 1, "subject": "Task 1: Phase B (a) regression test — native alarm during Reconnecting is dropped", "status": "pending"}, - {"id": 2, "subject": "Task 2: Phase B (b) test — OperatorComment flows through ForwardNativeAlarm", "status": "pending"}, - {"id": 3, "subject": "Task 3: Phase B (c) doc note — severity-bucket snapping (ScriptedAlarms.md)", "status": "pending"}, - {"id": 4, "subject": "Task 4: Galaxy (3) — extract shared stub-driver test harness (de-dup)", "status": "pending"}, - {"id": 5, "subject": "Task 5: Reconcile pending.md (disk-only, not committed)", "status": "pending"} + {"id": 1, "subject": "Task 1: Phase B (a) regression test — native alarm during Reconnecting is dropped", "status": "completed"}, + {"id": 2, "subject": "Task 2: Phase B (b) test — OperatorComment flows through ForwardNativeAlarm", "status": "completed"}, + {"id": 3, "subject": "Task 3: Phase B (c) doc note — severity-bucket snapping (ScriptedAlarms.md)", "status": "completed"}, + {"id": 4, "subject": "Task 4: Galaxy (3) — extract shared stub-driver test harness (de-dup)", "status": "completed"}, + {"id": 5, "subject": "Task 5: Reconcile pending.md (disk-only, not committed)", "status": "completed"} ], - "lastUpdated": "2026-06-14" + "lastUpdated": "2026-06-15" } diff --git a/docs/plans/2026-06-14-write-outcome-self-correction-plan.md.tasks.json b/docs/plans/2026-06-14-write-outcome-self-correction-plan.md.tasks.json index a0a7188c..57f5df1e 100644 --- a/docs/plans/2026-06-14-write-outcome-self-correction-plan.md.tasks.json +++ b/docs/plans/2026-06-14-write-outcome-self-correction-plan.md.tasks.json @@ -1,12 +1,12 @@ { "planPath": "docs/plans/2026-06-14-write-outcome-self-correction-plan.md", "tasks": [ - {"id": "361", "subject": "WT0: Create feature branch feat/write-outcome-self-correction", "classification": "trivial", "status": "pending"}, - {"id": "362", "subject": "WT1: Commons IOpcUaNodeWriteGateway + NodeWriteOutcome + Null default", "classification": "standard", "status": "pending", "blockedBy": ["361"]}, - {"id": "363", "subject": "WT2: Runtime ActorNodeWriteGateway (Asks RouteNodeWrite)", "classification": "standard", "status": "pending", "blockedBy": ["362"], "parallelizableWith": ["364"]}, - {"id": "364", "subject": "WT3: OpcUaServer node-manager seam swap + capture-prior + compare-and-revert", "classification": "high-risk", "status": "pending", "blockedBy": ["362"], "parallelizableWith": ["363"]}, - {"id": "365", "subject": "WT4: Host wire ActorNodeWriteGateway", "classification": "standard", "status": "pending", "blockedBy": ["363", "364"]}, - {"id": "366", "subject": "WT5: Live /run verification — failing write reverts, success stays", "classification": "verification", "status": "pending", "blockedBy": ["365"]} + {"id": "361", "subject": "WT0: Create feature branch feat/write-outcome-self-correction", "classification": "trivial", "status": "completed"}, + {"id": "362", "subject": "WT1: Commons IOpcUaNodeWriteGateway + NodeWriteOutcome + Null default", "classification": "standard", "status": "completed", "blockedBy": ["361"]}, + {"id": "363", "subject": "WT2: Runtime ActorNodeWriteGateway (Asks RouteNodeWrite)", "classification": "standard", "status": "completed", "blockedBy": ["362"], "parallelizableWith": ["364"]}, + {"id": "364", "subject": "WT3: OpcUaServer node-manager seam swap + capture-prior + compare-and-revert", "classification": "high-risk", "status": "completed", "blockedBy": ["362"], "parallelizableWith": ["363"]}, + {"id": "365", "subject": "WT4: Host wire ActorNodeWriteGateway", "classification": "standard", "status": "completed", "blockedBy": ["363", "364"]}, + {"id": "366", "subject": "WT5: Live /run verification — failing write reverts, success stays", "classification": "verification", "status": "completed", "blockedBy": ["365"]} ], - "lastUpdated": "2026-06-14" + "lastUpdated": "2026-06-15" }