diff --git a/archreview/plans/R2-09-driver-fleet-batch-plan.md.tasks.json b/archreview/plans/R2-09-driver-fleet-batch-plan.md.tasks.json index 0e58bbb9..b154d0d3 100644 --- a/archreview/plans/R2-09-driver-fleet-batch-plan.md.tasks.json +++ b/archreview/plans/R2-09-driver-fleet-batch-plan.md.tasks.json @@ -145,7 +145,7 @@ { "id": "B4.4", "subject": "B4: S7 seam comment pointing R2-01 at ConnectionBackoff; suites green; merge PR 4", - "status": "pending", + "status": "completed", "blockedBy": [ "B4.1", "B4.2", diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.S7/S7Driver.cs b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.S7/S7Driver.cs index f97b8b26..829d28d8 100644 --- a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.S7/S7Driver.cs +++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.S7/S7Driver.cs @@ -1215,9 +1215,14 @@ public sealed class S7Driver /// While the PLC is down every data call and probe tick pays a full connect attempt /// bounded only by _options.Timeout (STAB-8). This method is the single /// choke-point all S7 reconnects flow through (already gate-serialized), so the - /// fleet-wide connect-attempt throttle planned in R2-09 plugs in here: a - /// last-failed-attempt timestamp checked at the top of the slow path. Deliberately NOT - /// implemented driver-locally — see + /// fleet-wide connect-attempt throttle plugs in here. R2-09 (sub-batch B3/B4) shipped the + /// shared primitive + /// (src/Core/…/Core.Abstractions/ConnectionBackoff.cs) — the S7 wiring is a + /// per-driver ConnectionBackoff field consulted with ShouldAttempt(now) at + /// the top of the slow path (fail fast + degrade inside the window) plus + /// RecordFailure/RecordSuccess around the connect, all under _gate + /// (which satisfies the primitive's caller-synchronized contract; TwinCAT/FOCAS/AbCip + /// already wire it this way). Deliberately NOT implemented driver-locally here — owned by /// archreview/plans/R2-01-s7-fault-hardening-plan.md Finding 3. /// ///