From f93a1179dd068626ba7c594974f7d76b69f12707 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Fri, 13 Nov 2026 10:32:09 -0500 Subject: [PATCH] docs(ga): G7 PASS - FOCAS live CNC on vd03 (Makino 31i-B), axis tag added via owner-approved deploy e9fbe63e --- .../evidence/focas-g7-2026-11-13/RESULTS.md | 27 ++++++++++++++-- .../after-deploy-summary.txt | 32 +++++++++++++++++++ .../focas-g7-2026-11-13/axis-sub30.txt | 10 ++++++ .../vd03-log-deploy-excerpt.txt | 7 ++++ docs/plans/v2-ga-lab-gates-plan.md | 2 +- docs/v2/v2-release-readiness.md | 3 +- 6 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 docs/drivers/evidence/focas-g7-2026-11-13/after-deploy-summary.txt create mode 100644 docs/drivers/evidence/focas-g7-2026-11-13/axis-sub30.txt create mode 100644 docs/drivers/evidence/focas-g7-2026-11-13/vd03-log-deploy-excerpt.txt diff --git a/docs/drivers/evidence/focas-g7-2026-11-13/RESULTS.md b/docs/drivers/evidence/focas-g7-2026-11-13/RESULTS.md index f28fc14bf..192407fbe 100644 --- a/docs/drivers/evidence/focas-g7-2026-11-13/RESULTS.md +++ b/docs/drivers/evidence/focas-g7-2026-11-13/RESULTS.md @@ -1,7 +1,8 @@ # G7: FOCAS live-CNC smoke on a real FANUC control (2026-11-13) -**Result: PASS on every criterion that can be checked from here. Two exceptions: an axis position (vd03 has no axis -tags authored) and the comparison against the control panel (needs a person at the machine).** +**Result: PASS.** Every criterion passes. An axis tag was added to vd03 for the axis criterion (see "Axis position" +below). The one item not done is the comparison of the identity values against the control panel, which needs a person +at the machine. ## Setup @@ -17,9 +18,29 @@ tags authored) and the comparison against the control panel (needs a person at t |---|---|---| | The wire client opens a FOCAS2 session | **PASS.** The driver has served Good values since boot (12:28:45Z); every value below comes from that live session. | `reads.txt` | | Identity nodes return non-null values | **PASS** (non-null). `SeriesNumber` G431, `Version` 22.0, `CncType` 31, `MtType` MM, `MaxAxes` 32, `AxisCount` 7, all Good. **Not compared with the control panel** (needs a person at the machine). G431 matches the series recorded for this control in the 2026-10 wire-decode work. | `reads.txt` | -| An axis position reads Good with a plausible value | **NOT CHECKED HERE.** vd03's configuration authors no `Axes/` tags, and adding one would mean a deploy to DEV. Plausible Good values from the same live session: `Spindle/S1/Load` 56.7 % and `MotorSpeedPct` (moving), `Timers/CuttingSeconds`, `OperationMode/ModeText` AUTO, `Program/Name` `//CNC_MEM/USER/LIBRARY/O1111`. The position decode is pinned by real-31i-B captures from this machine (`docs/drivers/FOCAS.md` §"Wire decode corrections (2026-10)"). | `reads.txt` | +| An axis position reads Good with a plausible value | **PASS after the deploy below** (`Axes/X/AbsolutePosition` = 280.1574, Good). Before it: vd03's configuration authors no `Axes/` tags, and adding one would mean a deploy to DEV. Plausible Good values from the same live session: `Spindle/S1/Load` 56.7 % and `MotorSpeedPct` (moving), `Timers/CuttingSeconds`, `OperationMode/ModeText` AUTO, `Program/Name` `//CNC_MEM/USER/LIBRARY/O1111`. The position decode is pinned by real-31i-B captures from this machine (`docs/drivers/FOCAS.md` §"Wire decode corrections (2026-10)"). | `reads.txt` | | A subscription delivers ≥ 3 updates within 5 s | **PASS:** 6 Good updates of `Spindle/S1/Load` in 5 s (13:15:16–13:15:21Z). | `sub5.txt` | | No `EW_SOCKET` (-1) / `EW_HANDLE` (-7) during a 2-minute soak | **PASS.** Soak 13:15:22–13:17:27Z: a recursive subscription on the driver's 22 variables got 272 notifications, and 21 variables were Good throughout. The 22nd, `Program/BlockCount`, read `BadNoData` throughout (the control does not report it; the same in every deploy record). **0 `EW_SOCKET`/`EW_HANDLE` in the whole day's server log.** The only ERR/WRN lines in the window come from these reads connecting by IP ("domain not listed in the server certificate") and the known DEV mesh-PSK warning. | `soak-summary.txt`, `soak-notifications.txt`, `vd03-log-window.txt` | Record: CNC FANUC 31i-B (Makino Z-34184), series G431, version 22.0; test date 2026-11-13; OtOpcUa `76e73e7d` (deployed); client `otopcua-cli` from `c9bc358d`. + +## Axis position (owner-approved DEV config deploy, 2026-11-13 15:30Z) + +The owner approved adding an axis tag to vd03 so the axis criterion could be checked directly. +- **Authoring:** in vd03's AdminUI `/raw`: device `z-34184` → **Browse device** (a live FOCAS browse of the control + listed axes X, Y, Z, B, C, AA6, AA7) → selected `FOCAS/z-34184/Axes/X/AbsolutePosition` with "Create matching + tag-groups" → **Add 1 tag**. +- **Deploy:** `e9fbe63e`, revision `f902e9409d79…`, sealed 15:30:13Z. It also cleared the standing "Configuration + drift" chip left by the #903 edit-and-revert check. +- **Apply:** server log `AddressSpaceApplier: applied plan (kind="PureAdd", added=3, removed=0, changed=0, … + rebuild=false)` and `raw subtree materialised (containers=2, tags=1, subset=true, failed=0)`. This was a surgical + add: no rebuild, existing subscriptions untouched (`vd03-log-deploy-excerpt.txt`). +- **Read:** `ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Axes/X/AbsolutePosition` = **280.1574, Good**, 11 s after the + seal. ServiceLevel stayed 250. +- **Subscription:** 30 s, the axis held still (one Good notification, `axis-sub30.txt`). The 5-update subscribe + criterion is met by `Spindle/S1/Load` above. +- **Re-check of all 23 variables:** 22 Good + `BlockCount` `BadNoData`, as before (`after-deploy-summary.txt`). +- **Log:** still 0 `EW_SOCKET`/`EW_HANDLE` for the day. The only ERR lines after the deploy are these reads by IP. + +The tag is left in place on vd03 as a permanent axis-position monitor. diff --git a/docs/drivers/evidence/focas-g7-2026-11-13/after-deploy-summary.txt b/docs/drivers/evidence/focas-g7-2026-11-13/after-deploy-summary.txt new file mode 100644 index 000000000..f265d1cdd --- /dev/null +++ b/docs/drivers/evidence/focas-g7-2026-11-13/after-deploy-summary.txt @@ -0,0 +1,32 @@ + +==================== SUMMARY ==================== +Total subscribed: 23 + Ever went BAD during window: 1 + NEVER went bad (suspect): 22 + Last status GOOD: 22 + Last status NOT-GOOD: 1 + No update received at all: 0 + +--- Nodes that NEVER received a bad-quality update (suspect) --- + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Identity/AxisCount + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Identity/CncType + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Identity/MaxAxes + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Identity/MtType + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Identity/SeriesNumber + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Identity/Version + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/OperationMode/Mode + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/OperationMode/ModeText + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Program/MainNumber + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Program/Name + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Program/Number + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Program/ONumber + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Program/Sequence + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Spindle/S1/Load + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Spindle/S1/MotorSpeedPct + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Timers/CuttingSeconds + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Timers/CycleSeconds + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Timers/OperatingSeconds + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Timers/PowerOnSeconds + ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Axes/X/AbsolutePosition + ns=2;s=focas-z-34184/z-34184/parts-count + ns=2;s=focas-z-34184/z-34184/parts-required diff --git a/docs/drivers/evidence/focas-g7-2026-11-13/axis-sub30.txt b/docs/drivers/evidence/focas-g7-2026-11-13/axis-sub30.txt new file mode 100644 index 000000000..cb1281980 --- /dev/null +++ b/docs/drivers/evidence/focas-g7-2026-11-13/axis-sub30.txt @@ -0,0 +1,10 @@ +Subscribed to 1/1 nodes (interval: 500ms). Press Ctrl+C to stop and print summary. +[11/13/2026 15:30:13] ns=2;s=focas-z-34184/z-34184/FOCAS/z-34184/Axes/X/AbsolutePosition = 280.1574 (Good [0x00000000]) + +==================== SUMMARY ==================== +Total subscribed: 1 + Ever went BAD during window: 0 + NEVER went bad (suspect): 1 + Last status GOOD: 1 + Last status NOT-GOOD: 0 + No update received at all: 0 diff --git a/docs/drivers/evidence/focas-g7-2026-11-13/vd03-log-deploy-excerpt.txt b/docs/drivers/evidence/focas-g7-2026-11-13/vd03-log-deploy-excerpt.txt new file mode 100644 index 000000000..613b9bacd --- /dev/null +++ b/docs/drivers/evidence/focas-g7-2026-11-13/vd03-log-deploy-excerpt.txt @@ -0,0 +1,7 @@ +2026-11-13 10:30:13.208 -05:00 [INF] AddressSpaceApplier: applied plan (kind="PureAdd", added=3, removed=0, changed=0, surgicalRawTags=0, unsRefDeltas=0, renamedFolders=0, rebuild=false) +2026-11-13 10:30:13.208 -05:00 [INF] AddressSpaceApplier: hierarchy materialised (areas=1, lines=1, equipment=1, failed=0) +2026-11-13 10:30:13.208 -05:00 [INF] AddressSpaceApplier: raw subtree materialised (containers=2, tags=1, subset=true, failed=0) +2026-11-13 10:30:23.901 -05:00 [ERR] The domain 'opc.tcp://10.220.157.247:4840/OtOpcUa' is not listed in the server certificate. +2026-11-13 10:30:25.383 -05:00 [ERR] The domain 'opc.tcp://10.220.157.247:4840/OtOpcUa' is not listed in the server certificate. +2026-11-13 10:30:33.433 -05:00 [ERR] The domain 'opc.tcp://10.220.157.247:4840/OtOpcUa' is not listed in the server certificate. +2026-11-13 10:31:04.723 -05:00 [ERR] The domain 'opc.tcp://10.220.157.247:4840/OtOpcUa' is not listed in the server certificate. diff --git a/docs/plans/v2-ga-lab-gates-plan.md b/docs/plans/v2-ga-lab-gates-plan.md index 013fcff94..edd39dd1e 100644 --- a/docs/plans/v2-ga-lab-gates-plan.md +++ b/docs/plans/v2-ga-lab-gates-plan.md @@ -311,6 +311,6 @@ Record: client name + version, OtOpcUa git SHA, test date. | G4 | Audit driver table | All 8 drivers listed as shipped | Dev | | G5 | Run deployment checklist doc | All items checked; Fleet Admin signs off — **SIGNED OFF 2026-11-13** | Fleet Admin | | G6 | Browse/read/subscribe against live Galaxy | Good quality, non-empty tree | Dev (dev box) | -| G7 | FOCAS CNC smoke — see live-hardware runbook | Session open, Good quality reads | Dev + lab hardware | +| G7 | FOCAS CNC smoke — see live-hardware runbook | Session open, Good quality reads — **PASS 2026-11-13** (vd03, Makino 31i-B) | Dev + lab hardware | | G8 | CTT profile run against live endpoint | **Waived 2026-11-13 (owner)** | — | | G9 | Redundancy cutover runbook | A-block + B2 pass with >= 1 client — **PASS 2026-11-13** (`otopcua-cli`) | Dev + two instances | diff --git a/docs/v2/v2-release-readiness.md b/docs/v2/v2-release-readiness.md index cfb5cf229..ccbc73b75 100644 --- a/docs/v2/v2-release-readiness.md +++ b/docs/v2/v2-release-readiness.md @@ -137,12 +137,13 @@ v2 GA requires all of the following: - [x] Phase 5 driver complement shipped (Galaxy, Modbus, S7, OpcUaClient, AbCip, AbLegacy, TwinCAT, FOCAS). - [x] Production deployment checklist (separate doc) signed off by Fleet Admin. **G5 SIGNED OFF 2026-11-13** by the owner as Fleet Admin (#615). - [x] At least one end-to-end integration run against the live Galaxy on the dev box succeeds. **G6 PASS 2026-11-12** (#615): windev test Galaxy `DEV` through mxaccessgw `447070a5`; browse (raw + UNS), read, subscribe, write and readback, and native alarm → Part 9 → ack (confirmed in Galaxy) → clear. Evidence: `docs/drivers/evidence/galaxy-g6-e2e-2026-11-12.md`. Found #895 (fixed, `e113faf5`) and #896 (open). DeployWatcher not exercised (no headless Galaxy redeploy). -- [ ] FOCAS live-CNC wire-level smoke (#54) runs clean against a real FANUC control. +- [x] FOCAS live-CNC wire-level smoke (#54) runs clean against a real FANUC control. **G7 PASS 2026-11-13** on the deployed DEV server (vd03, `76e73e7d`) against the Makino Z-34184 FANUC 31i-B (series G431, version 22.0). Identity, axis `X/AbsolutePosition` (added by owner-approved deploy `e9fbe63e`, a surgical PureAdd), 6 updates in 5 s, and a 2-minute soak with 0 `EW_SOCKET`/`EW_HANDLE`. The identity values were not compared against the control panel. Evidence: `docs/drivers/evidence/focas-g7-2026-11-13/RESULTS.md`. - [x] ~~OPC UA conformance test (CTT or UA Compliance Test Tool) passes against the live endpoint.~~ **G8 WAIVED by the owner 2026-11-13** (#615): no CTT run is required for v2 GA. - [x] Non-transparent redundancy cutover validated with at least one production client (Ignition 8.3 recommended — see decision #85). **G9 PASS 2026-11-13** (#615), with `otopcua-cli` as the client (owner-approved), on an isolated 2-node pair in the deployed `Unset` mode (`003c7f89`): A1–A3, A5, A7, A8, B2 (crash) and B3 pass; A4/A5b are recorded as unmet under `Unset` and met under `Warm` (#717). Evidence: `docs/plans/evidence/2026-11-13-615-g9/RESULTS.md`. ## Change log +- **2026-11-13** — **G7 PASS:** a read-only FOCAS live-CNC smoke on vd03 against the Makino Z-34184 31i-B. The owner approved adding one axis tag (`Axes/X/AbsolutePosition`, deploy `e9fbe63e`, surgical PureAdd); it reads 280.1574 Good. The panel comparison was not done (it needs a person at the machine). G1 awaits the owner's decision. - **2026-11-13** — **G2 PASS.** Two full `dotnet test ZB.MOM.WW.OtOpcUa.slnx` runs (60 projects, ~21k tests). One real defect: a bare `"driver"` role literal from #717's `c569f806`, fixed in `f416b883`. Every other failure is environmental and filed: the Modbus fixture is swamped by load (#909), an intermittent opc-plc `BadRequestInterrupted` (#910), and a scripted-alarm run-guard timing test (#911). G1 (stale Phase 6 compliance scripts) and G7 (FOCAS live CNC) evidence is recorded and awaits the owner's decision. - **2026-11-13** — **G5 (#615) signed off** by the owner as Fleet Admin. With G6/G9 passed and G8 waived, every #615 gate is complete and #615 is closed. - **2026-11-13** — **G9 (#615) PASS and G8 waived.** The owner approved `otopcua-cli` as the G9 client and waived the CTT (G8) for GA. G9 ran on an isolated 2-node pair (`otopcua-g9`, `master` `003c7f89`, redundancy mode `Unset` as deployed). ServiceLevel 250/240, a follower stop left the Primary at 250, and ServerArray lists both URIs. On a graceful Primary stop the CLI's `-F` sessions failed over in about 11 s. On a `docker kill` of the Primary they failed over within 1 s, with a ~2 s data gap and no Bad values; the survivor reached 250 at +44 s. The returning node settled at 240 with no failback. A4 (`RedundancySupport`) and A5b (`ServerUriArray`) are unmet under `Unset` and met under `Warm` (#717, closed; enabling Warm is #907). The run found a CLI defect: array values printed as `System.String[]`, fixed by `ValueFormatter`. Evidence: `docs/plans/evidence/2026-11-13-615-g9/RESULTS.md`. G5 (Fleet Admin sign-off) is the only open exit criterion.