docs(review): record #761 gate D AdminUI live pass (4/5 PASS; 4 unconfirmed deletes)
v2-ci / unit-tests (push) Has been cancelled

Claude-Session: https://claude.ai/code/session_01GT67AEHd2Acv1YPwGfXEoV
This commit is contained in:
Joseph Doherty
2026-11-09 22:15:17 -05:00
parent f717735753
commit 20820bbf76
+42
View File
@@ -274,3 +274,45 @@ Mishap: two aborted SQL Server probe attempts (row-by-row seeding was too slow,
## Cleanup
Container `h1-gate-questdb` removed. The fixture host is unchanged. The worktree `scratchpad/wt/otopc-fix` (branch w18/fixtures) is left in place with uncommitted probe edits. Remove it with `git worktree remove --force` if not wanted.
## Gate D (#745) — AdminUI live pass, docker-dev (2026-11-09) — FAIL (1 of 5 checks)
Overall: four checks PASS; the delete-confirmation check FAILS on four pages (filed as a follow-up issue, see #761). Full record below, as written by the Chrome pass.
Date: 2026-11-09 (container clock 2026-11-10 03:xx UTC). Rig: local docker-dev, otopcua-host:dev image built 2026-11-09 20:35 EST from master 1b9c36f3 (per coordinator; rig built from a scratchpad worktree no longer on disk, so commit not re-verifiable from the container). AdminUI http://localhost:9200 (login disabled, session "multi-role-test"). Wonder boxes untouched. No deploy performed.
### 1. 100 KB script survives save + reload - PASS
Procedure: /scripts/new, set Monaco model to 102,492 chars (1,200+ comment lines + `return 1;`), name gateD-100kb-test, Create. Reloaded /scripts/SC-d82b3a36fd85; editor text === regenerated original (identical, length 102492 both). Then deleted it (own modal).
### 2. Two-tab /hosts CPU flat with ~50 drivers - PASS
Rig has 52 drivers on cluster MAIN (48 int3b-mb-*, blackhole, Calc, opcplc, pymodbus); site-a/b have none. `docker stats --no-stream` on central-1/central-2 (the AdminUI hosts), 8 samples ~12s apart (~100s) per condition:
- no /hosts tab (on /): central-1 11.0%, central-2 10.9% avg
- 1 /hosts tab (first run): c1 9.7%, c2 11.4%
- 2 /hosts tabs: c1 10.9%, c2 12.1% avg
Within noise (range 8-17% in every condition). Flat. Raw: scratchpad/cpu-*.txt.
### 3. 5k-tag device renders < 2 s - PASS
No such device existed. Created disabled-in-effect (never deployed) Modbus driver gateD-bulk/device gdev under docker-dev, imported 5000-row CSV via the Raw tree modal (parse+review 206 ms, commit 717 ms). Expanding gdev: first tag rows in DOM 14-20 ms after click, painted (double rAF) 44 ms. Tree paged: 500 rendered ("Show 500 more (4500 not shown)") and DOM ~611 nodes. Far under 2 s.
Cleanup: tags cannot be bulk-deleted in UI (device delete: "Delete blocked - contains tags"), so removed gateD-bulk rows (5000 Tag, TagGroup, Device, DriverInstance) by scoped SQL delete in a transaction on the rig OtOpcUa DB (needed `sqlcmd -I`). Verified 0 gateD DriverInstances, Tag total back to 55.
Observation (not a defect): no bulk "delete all tags in device" in Raw tree.
### 4. Every delete asks for confirmation - FAIL (4 defects)
window.confirm overridden; no native confirm ever fired. Own modal confirmed + Cancel verified (item survives) for: script delete (ScriptEdit), API key delete (/apikeys), all 10 UNS-tree deletes on /uns (enterprise, clusters, area, line, equipment), Raw-tree driver delete and device delete (modals). Equipment-page virtual-tag/alarm/reference deletes: source uses ConfirmDeleteVirtualTag/ConfirmDeleteAlarm/ConfirmRemoveReference; no live rows on the sampled equipment (NOT exercised live). Certificates delete uses RequestAction -> Confirm panel (source).
DEFECTS - delete executes immediately on click, no confirmation:
a) /role-grants Delete (RoleGrants.razor:68 -> DeleteAsync(r.Id)). LIVE-VERIFIED: added test grant cn=gated-test..., clicked Delete, row gone instantly, no modal. (Test grant thus already removed.)
b) ClusterEdit.razor:102 `@onclick="DeleteAsync"` (cluster delete) - source only
c) NodeEdit.razor:119 `@onclick="DeleteAsync"` (cluster node delete) - source only
d) AclEdit.razor:151 `@onclick="DeleteAsync"` (node ACL delete) - source only
(CollectionEditor.razor:31 per-row Delete in driver forms is a working-copy edit committed on Save - not counted.)
Repro for (a): http://localhost:9200/role-grants, add any group, press its Delete.
### 5. A6 diagnostics panel shows real counts - PASS
/fleet/diagnostics?node=central-1:4053 : DRIVERS 52, FAULTED DEVICES 0, CONFIG SOURCE live, REVISION e221b1792cbd..., per-driver rows (48 HEALTHY int3b-mb-* with 1 connected device each, Calc/opcplc/pymodbus HEALTHY, int3b-blackhole INITIALIZING 0 connected). /hosts shows the same 52 driver instances and blackhole INITIALIZING "1 / 1 DOWN". Disabled int3b-bulk correctly absent. Minor: blackhole's down device is not counted in "FAULTED DEVICES 0" (state INITIALIZING, not faulted) - arguably fine, flag for A6 owner.
### Revert state
Test script, test role grant, gateD-bulk driver/device/5000 tags all removed; no deploys; browser tab closed. Rig config as found.
### Still not run after gate D
- Gate F (Galaxy) — needs a reachable mxaccessgw.
- Hardware userGates (real PLCs), as listed under NOT RUN above.