docs(#456): live grind finding — retry/breaker write-trigger is structurally impossible #466

Merged
dohertj2 merged 1 commits from docs/456-retry-breaker-live-finding into master 2026-07-15 14:48:27 -04:00
Owner

Advances #456 item 1. Ran the full live grind (authored a Modbus equipment tag, connected to the sim, LDAP-authed writes, docker pause the peer). 4 failing wrapped writes → 0 retry/breaker lines on either central.

Structural finding (corrects the issue's hypothesis): ModbusDriver.WriteAsync swallows every exception and returns WriteResult(StatusBadInternalError) — it never throws (ModbusDriver.cs:964-967); CapabilityInvoker feeds only exceptions to Polly (no result-status inspection); breaker ShouldHandle is Handle<Exception>; Write retry is pinned to 0 (R2-02/S-8). So a failing wrapped write emits no line by construction, for any polling driver — even an idempotent write to a dead endpoint returns a bad status, not a throw. The line is reachable only for a session driver (OpcUaClient) faulting mid-Discover/Subscribe (30s Polly timeout throws) — a genuine production timing race, not deterministically forcible on the rig. Behaviour stays unit-proven by the pipeline-builder logging test.

Docs: new finding artifact + FOLLOWUP-10 update recommending item 1 be closed on this finding. No code changes.

Advances #456 item 1. Ran the full live grind (authored a Modbus equipment tag, connected to the sim, LDAP-authed writes, `docker pause` the peer). **4 failing wrapped writes → 0 retry/breaker lines** on either central. **Structural finding (corrects the issue's hypothesis):** `ModbusDriver.WriteAsync` swallows every exception and returns `WriteResult(StatusBadInternalError)` — it never throws (`ModbusDriver.cs:964-967`); `CapabilityInvoker` feeds only *exceptions* to Polly (no result-status inspection); breaker `ShouldHandle` is `Handle<Exception>`; `Write` retry is pinned to 0 (R2-02/S-8). So a failing wrapped **write** emits **no line by construction**, for any polling driver — even an idempotent write to a dead endpoint returns a bad status, not a throw. The line is reachable **only** for a session driver (OpcUaClient) faulting *mid-`Discover`/`Subscribe`* (30s Polly timeout throws) — a genuine production timing race, not deterministically forcible on the rig. Behaviour stays unit-proven by the pipeline-builder logging test. Docs: new finding artifact + FOLLOWUP-10 update recommending item 1 be closed on this finding. No code changes.
dohertj2 added 1 commit 2026-07-15 14:48:17 -04:00
docs(#456): live grind finding — write-trigger structurally impossible
v2-ci / build (pull_request) Successful in 4m29s
v2-ci / unit-tests (pull_request) Failing after 10m15s
5da7ba6517
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.
dohertj2 merged commit 46bc458fb8 into master 2026-07-15 14:48:27 -04:00
Sign in to join this conversation.