docs(plans): create-time bindings — live rig gate PASS (Object-node pick, prefill, 30/30 bound, deploy-gate A/B) + task status

Claude-Session: https://claude.ai/code/session_01G2GHPnbbKGvyyfbr2XBRVH
This commit is contained in:
Joseph Doherty
2026-08-21 06:20:50 -04:00
parent a26edffd4c
commit 691a2f2f80
2 changed files with 65 additions and 4 deletions
@@ -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 <main>/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
```