From 691a2f2f802029c3a0ef468b0b53e532cce9cc57 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Fri, 21 Aug 2026 06:20:50 -0400 Subject: [PATCH] =?UTF-8?q?docs(plans):=20create-time=20bindings=20?= =?UTF-8?q?=E2=80=94=20live=20rig=20gate=20PASS=20(Object-node=20pick,=20p?= =?UTF-8?q?refill,=2030/30=20bound,=20deploy-gate=20A/B)=20+=20task=20stat?= =?UTF-8?q?us?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Claude-Session: https://claude.ai/code/session_01G2GHPnbbKGvyyfbr2XBRVH --- .../2026-08-21-create-instance-bindings.md | 61 +++++++++++++++++++ ...-21-create-instance-bindings.md.tasks.json | 8 +-- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/docs/plans/2026-08-21-create-instance-bindings.md b/docs/plans/2026-08-21-create-instance-bindings.md index 1a34e8d9..61ee842d 100644 --- a/docs/plans/2026-08-21-create-instance-bindings.md +++ b/docs/plans/2026-08-21-create-instance-bindings.md @@ -813,3 +813,64 @@ dotnet test tests/ZB.MOM.WW.ScadaBridge.CentralUI.Tests dotnet test tests/ZB.MOM.WW.ScadaBridge.TemplateEngine.Tests --filter Flatten ``` Expected: 0 errors, all green (the known env-only Playwright E2E project is not in this list). Then `git log --oneline main..HEAD` shows 7 commits; hand off via superpowers-extended-cc:finishing-a-development-branch. + +--- + +## Status — implemented 2026-08-21 + +All 9 tasks done on branch `create-instance-bindings`. **Tasks 4 and 5 landed in one +commit**: Task 4's card-state fields are write-only until Task 5's markup reads them and +the CentralUI project treats unused-field warnings as errors, so Task 4's "build → 0 +errors" gate is unachievable in isolation (plan defect). Task 4's instruction to move the +existing `@code` fields into the partial was skipped — a partial class already shares +private members across files. The card also drops the `binding-panel` class the Configure +panel carries: it has no CSS rule anywhere in the repo. + +### Task 7 — live check on the docker rig (PASS) + +Image built with `docker/build.sh` from the worktree, rig recreated with +`docker compose -f
/docker/docker-compose.yml up -d --force-recreate`; central +`/health/ready` Healthy in ~20s. Driven in Chrome at `http://localhost:9000` as +`multi-role`. Template **Motor Controller** (id 4, 3 compositions) at **Test Plant A** +(site 1, `OPC PLC Simulator`, OpcUa). + +1. **Card appears on template+site.** `30 data-sourced attribute(s) in 4 group(s)` — + `(instance)` 13, `CoolingTank` 7 *(incl. DrivePump, DrivePump.AlarmSensor, + DrivePump.TempSensor)*, `CoolingTank2` 7, `Pump` 3 *(incl. AlarmSensor, TempSensor)*. + Identical grouping to the Configure page, nested modules folded. `4 group(s) unbound`, + footer "saves 0 binding(s)". +2. **Object-node selection works.** Root `Browse…` opened the picker with the new + "Select an object or tag" prompt; every root node (`OpcPlc`, `Boilers`, `Locations`, …) + rendered as a *clickable* link — all Objects, plain text before this change. Picked + `nsu=http://microsoft.com/Opc/OpcPlc/Boiler;i=5`; it landed in the root Object box. +3. **Prefill.** Every group took the connection; `(instance)` took the root verbatim (no + pill); the three module groups got `{root}.{groupKey}` with a **suggested** pill. All + four → **bound**, the unbound badge cleared, footer "saves 30 binding(s)". +4. **Per-group Browse.** `Pump` → picked the `Locations` Object (`i=31915`); the value + replaced the suggestion and the **suggested** pill disappeared (a browse pick is a + typed value, per `SetGroupObject`). +5. **Create.** Landed on `/deployment/instances/3660/configure?created=1&bound=30` with + the green notice *"Instance created. 30 binding(s) saved. Test Bindings, then Deploy."*; + Configure's panel showed the same 4 groups all **bound**, Pump carrying `i=31915`, and + **Test Bindings (30)** enabled. +6. **Skip bindings.** Second instance with the box ticked → group rows collapse, footer + "Creates the instance without bindings", lands on `?created=1` (no `bound`) with + *"Instance created. Bind the groups below, then Deploy."*, `30 unbound`, Test Bindings (0). + Pre-2026-08-21 behaviour preserved exactly. +7. **Deploy gate A/B — the decisive check.** + - id 3660 (bound at creation): `4 errors — ScriptCompilation (4)`, **zero ConnectionBinding**. + - id 3661 (skipped): `34 errors — ScriptCompilation (4) + ConnectionBinding (30)`. + + The create-time bindings fully satisfy `ValidateConnectionBindingCompleteness`. The 4 + ScriptCompilation errors are a **pre-existing property of the rig's Motor Controller + template** (identical on both instances, unrelated to this work). +8. Both test instances deleted (`instance delete --id 3660 / 3661`). + +### Task 9 — solution build + suites (PASS) + +``` +dotnet build ZB.MOM.WW.ScadaBridge.slnx 0 Warning(s), 0 Error(s) +dotnet test tests/…DeploymentManager.Tests Passed 148, Failed 0 +dotnet test tests/…CentralUI.Tests Passed 1130, Failed 0 +dotnet test tests/…TemplateEngine.Tests --filter Flatten Passed 108, Failed 0 +``` diff --git a/docs/plans/2026-08-21-create-instance-bindings.md.tasks.json b/docs/plans/2026-08-21-create-instance-bindings.md.tasks.json index 053f34b9..14c067a3 100644 --- a/docs/plans/2026-08-21-create-instance-bindings.md.tasks.json +++ b/docs/plans/2026-08-21-create-instance-bindings.md.tasks.json @@ -45,7 +45,7 @@ { "id": 7, "subject": "Task 7: Live check on the docker rig", - "status": "pending", + "status": "completed", "blockedBy": [ 6 ] @@ -53,7 +53,7 @@ { "id": 8, "subject": "Task 8: Docs", - "status": "pending", + "status": "completed", "blockedBy": [ 6 ] @@ -61,7 +61,7 @@ { "id": 9, "subject": "Task 9: Solution build + impacted suites", - "status": "pending", + "status": "completed", "blockedBy": [ 1, 2, @@ -74,5 +74,5 @@ ] } ], - "lastUpdated": "2026-08-21T00:00:00Z" + "lastUpdated": "2026-08-21T10:20:00Z" } \ No newline at end of file