Ran the full item-1 grind (authored a live Modbus equipment tag, connected
to the sim, LDAP-authed writes, docker pause the peer). 4 failing wrapped
writes produced 0 retry/breaker lines on either central.
Root cause (corrects the issue's hypothesis): ModbusDriver.WriteAsync swallows
all exceptions and returns WriteResult(StatusBadInternalError) — never throws;
CapabilityInvoker feeds only exceptions to Polly; breaker ShouldHandle is
Handle<Exception>; Write retry pinned to 0 (R2-02/S-8). So a failing wrapped
write emits no line by construction, for any polling driver. The line is
reachable ONLY for a session driver (OpcUaClient) faulting mid-Discover/Subscribe
(30s Polly timeout throws) — a production timing race, not deterministically
forcible on the rig. Behaviour stays unit-proven by the pipeline-builder test.
- New: archreview/plans/artifacts/456-retry-breaker-live-finding-2026-07-15.md
- FOLLOWUP-10 updated with the structural finding + recommendation to close item 1.
2026-07-15 14:48:03 -04:00
2 changed files with 105 additions and 0 deletions
`DiscoverAsync` under a 30 s Polly timeout on each `Connected` entry.
So the **only** way to emit the line is a session driver whose session faults **while a wrapped
`Discover`/`Subscribe` is in flight** (e.g. `docker pause` of a live OPC UA endpoint mid-discovery → the
30 s timeout throws `TimeoutRejectedException` → `Discover` retry ×2 → `Driver resilience retry`). This is a
genuine production event under real network faults, but it is a **timing race** — connect must succeed, then
the fault must land during the wrapped call, before the session-keepalive drops the driver to `Reconnecting`
(where the wrapped sites no longer fire). It cannot be deterministically forced on the rig with the available
fixtures (opc-plc was down; no on-demand rediscovery trigger).
## Conclusion / recommendation
- **Item 2 (the real code gap — `ResilienceConfig` in the deploy artifact)** is done + live-verified on both
nodes (PR #461).
- **Item 1** is **deterministically proven** by the `DriverResiliencePipelineBuilder` logging unit test (the
`OnRetry`/`OnOpened` handlers emit the exact lines) plus `CapabilityInvoker` retry tests and the factory
override test. The **live** capture is not deterministically achievable from the dev rig — and, more
importantly, the grind proved the issue's proposed write-trigger is **structurally impossible**. The line is
an OpcUaClient-only, transient-fault-mid-`Discover`/`Subscribe` event.
- **Recommend closing item 1** on this finding: the observability surface is unit-proven and the wrapped
dispatch path is now **live-confirmed end-to-end** (authored driver → connected → LDAP write → wrapped
`WriteAsync` → faulted → surfaced). The remaining "eyeball the raw line" is an operator/staging observation
during a real OpcUaClient session fault, not a code deliverable.
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.