{ "planPath": "docs/plans/2026-06-16-stillpending-phase-6-adminui.md", "branch": "feat/stillpending-phase-6-adminui", "baseMaster": "156aa900", "designCommit": "dbff29dd", "executionState": "COMPLETE — all 10 tasks done; final integration review = SHIP; live /run acceptance PASS. Ready to merge to master + push.", "tasks": [ {"id": 452, "subject": "P6 Task 1 (A): Typed editors for OpcUaClient + Historian", "status": "completed", "commit": "72d414ad"}, {"id": 453, "subject": "P6 Task 2 (B): isHistorized + historianTagname first-class fields", "status": "completed", "commit": "c00a5471", "blockedBy": [452]}, {"id": 454, "subject": "P6 Task 3 (C): Native-alarm HistorizeToAveva opt-out", "status": "completed", "commit": "6a8020e7"}, {"id": 455, "subject": "P6 Task 4 (D): Galaxy picker pre-fills alarm fields from IsAlarm", "status": "completed", "commit": "069a5f31", "blockedBy": [454]}, {"id": 456, "subject": "P6 Task 5 (E): Build-address pickers in protocol-driver Tag editors", "status": "completed", "commit": "9a8b8ff6", "blockedBy": [453]}, {"id": 457, "subject": "P6 Task 6 (F): UNS-tree delete for Cluster + Enterprise", "status": "completed", "commit": "526eebb3"}, {"id": 458, "subject": "P6 Task 7 (G): Create-new-script from the inline vtag panel", "status": "completed", "commit": "c98625fd"}, {"id": 459, "subject": "P6 Task 8: Docs + bookkeeping", "status": "completed", "commit": "cbaf1c39"}, {"id": 460, "subject": "P6 Task 9: Full build + test + final integration review", "status": "completed", "commit": "23f353e7"}, {"id": 461, "subject": "P6 Task 10: Live /run acceptance (agent-driven)", "status": "completed"} ], "reviewFixCommit": "68f9eef6", "finalIntegrationReview": "SHIP (no Critical/Important).", "liveRun": { "rig": "docker-dev central-1 rebuilt from branch; :9200 login-disabled; verified via Chrome", "verified": [ "Task1: OpcUaClient typed editor renders (was raw-JSON)", "Task2: Historize checkbox + tagname override; create->reopen round-trip persisted; also renders on raw-JSON + Galaxy paths (driver-agnostic)", "Task4: Galaxy 'Browse Galaxy' DriverTagPicker shell opens live", "Task6: Cluster + Enterprise Delete tree actions render (were absent)", "Task7: 'New script' creates+binds a script and expands the inline Monaco editor" ], "notDirectlyDriven": [ "Task5 Modbus 'Build address' button — shell mechanism proven via Galaxy picker (same DriverTagPicker); Modbus typed editor did not dispatch on the rig because MAIN-modbus-eq is seeded DriverType='Modbus' vs AdminUI 'ModbusTcp' (see followups)", "Task3 native-alarm 'Historize to AVEVA' checkbox — needs a TagConfig.alarm object; unit-tested + reviewed, not driven this pass" ] }, "followups": { "modbusDriverTypeMismatch": "Pre-existing: AdminUI uses 'ModbusTcp' (DriverIdentitySection/DriverTypePicker/DriverEditRouter/TagConfigEditorMap/Validator/13 tests) but runtime+rig-seed use 'Modbus' (ModbusDriver.DriverType/DriverTypeName). Rig-seeded Modbus drivers fall to raw-JSON tag editor + mis-dispatch the driver-config page. NOT a P6 regression; reconcile across runtime+AdminUI+seed+tests in a separate effort. Memory: project_modbus_drivertype_mismatch.", "task2_FU1": "Galaxy re-pick of an alarm attribute resets prior alarm edits (document or preserve).", "task7_FU2": "Inline-created script dropdown label format could drift (reuse canonical label or re-fetch)." }, "decisions": { "task6": "Option B — ServerCluster has no concurrency token; cluster delete takes no RowVersion (matches existing ClusterEdit.razor), refuse-if-children, NO migration. RowVersion concurrency is a migration-gated follow-up.", "task4": "Additive optional bool IsAlarm on the in-process Commons/Browsing AttributeInfo browse DTO (NOT a wire/proto contract)." }, "deferred": "Item 7 (Hosts page per-driver-instance rows) — F7-runtime-blocked, not implemented.", "lastUpdated": "2026-06-16" }