SdkAlarmHistorianWriteBackend.WriteBatchAsync replaces the RetryPlease placeholder with the real entry point — HistorianAccess.AddStreamedValue (HistorianEvent, out HistorianAccessError) in aahClientManaged, pinned by decompiling the installed SDK. The write path opens its own ReadOnly=false connection: the query-side HistorianDataSource opens ReadOnly sessions and AddStreamedValue fails on those with WriteToReadOnlyFile. IHistorianConnectionFactory gains a readOnly parameter (default true, query path unchanged); BuildConnectionArgs is extracted as a pure helper. HistorianClusterEndpointPicker is shared for node failover; connection-class errors abort the batch as RetryPlease and reset the connection, malformed-input codes map to PermanentFail. Tests: connection-unavailable batch deferral, ClassifyOutcome error-code table, BuildConnectionArgs read-vs-write shaping (80 pass, 2 rig-skipped). Live_* round-trip tests stay Skip-gated for the D.1 rollout smoke. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
55 lines
2.8 KiB
Markdown
55 lines
2.8 KiB
Markdown
# Loose ends
|
||
|
||
State as of 2026-05-18, after the #9–#29 task-list run. Everything on the
|
||
formal task list is shipped except #20; the items below are what genuinely
|
||
remains, plus follow-ups surfaced during the run.
|
||
|
||
## Open task
|
||
|
||
- **#20 — D.1 dev-rig rollout smoke.** A full 3-service deployment
|
||
(gateway + worker + server + Wonderware historian sidecar): deploy the
|
||
refreshed binaries, run `scripts/install/Refresh-Services.ps1`, exercise
|
||
alarms end-to-end, and capture the rollout artifact. The code blockers
|
||
were cleared by #18; the act itself needs the physical AVEVA dev rig and
|
||
cannot be produced from a dev box. Runbook context in
|
||
`docs/plans/alarms-worker-wiring-plan.md`.
|
||
|
||
## Follow-ups surfaced during the run
|
||
|
||
- **~~C.1 live SDK binding.~~** DONE (code). `SdkAlarmHistorianWriteBackend`
|
||
(`src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Historian.Wonderware/Backend/`) now
|
||
writes via the real entry point `HistorianAccess.AddStreamedValue(HistorianEvent,
|
||
out error)` in `aahClientManaged`. Two plan corrections found while pinning it:
|
||
(a) `ArchestrAAlarmsAndEvents.SDK` has no writer — it's a WCF query proxy;
|
||
(b) writes need their own `ReadOnly=false` connection, not the shared read
|
||
pool. Remaining: the live-rig write smoke (the `Live_*` tests are still
|
||
`Skip`-gated) — folds into #20 / D.1.
|
||
|
||
- **~~#24 Shelve-method routing.~~** DONE. Acknowledge / Confirm already
|
||
routed; OneShotShelve / TimedShelve / Unshelve now route via the native
|
||
`AlarmConditionState.OnShelve` / `OnTimedUnshelve` hooks wired in
|
||
`DriverNodeManager.MarkAsAlarmCondition` (scripted alarms get a shelvable
|
||
`ShelvedStateMachine` subtree created before `alarm.Create`). The three
|
||
per-instance shelve method NodeIds are indexed so the Call gate resolves
|
||
them to `OpcUaOperation.AlarmShelve`. `AddComment` also now routes to the
|
||
engine (gated at the `AlarmAcknowledge` tier) — `phase-7-status.md` Gap 1
|
||
is fully closed. Remaining: address-space materialisation of the shelve
|
||
method nodes is best confirmed by a live OPC UA browse (pairs with the
|
||
G6 / D.1 rig steps).
|
||
|
||
- **mxaccessgw alarm epic branch.** The alarm subsystem work (A.2/A.3/A.4
|
||
+ the two production-gap fixes from #18) lives on the mxaccessgw branch
|
||
`docs/alarm-client-wm-app-finding`. It is NOT merged to mxaccessgw's main.
|
||
Whether/when to merge the alarm epic to main is an open release decision.
|
||
|
||
- **#15 operator/lab GA gates.** Two v2 GA gates are manual lab steps, not
|
||
automatable here: the OPC UA CTT (Compliance Test Tool) pass and the
|
||
deployment-checklist signoff. Documented in
|
||
`docs/plans/v2-ga-lab-gates-plan.md`.
|
||
|
||
## Done — for reference
|
||
|
||
The 5 Phase 7 gaps discovered mid-run (#24–#28) were all completed and
|
||
merged; no Phase 7 gaps remain open. Add any new follow-ups above as they
|
||
are spun out.
|