docs(archreview): mark Critical 3 (S7 reconnect / STAB-1) done + live-verified
STATUS.md + 05 plan banner: crit3 branch 25c0c6f6, IS7Plc seam + lazy reconnect,
4 unit guards + full S7 suite, LIVE snap7 container-bounce proof (recovers with no
redeploy). Next: Critical 4 (TwinCAT ADS re-registration, unit-only — no TC3 fixture).
This commit is contained in:
@@ -1,8 +1,10 @@
|
|||||||
# Design + Implementation Plan — 05 Protocol Drivers
|
# Design + Implementation Plan — 05 Protocol Drivers
|
||||||
|
|
||||||
> **Status (2026-07-08):** not started. Holds **2 Criticals** — STAB-1 (S7 no-reconnect, task 4) + STAB-2
|
> **Status (2026-07-08):** **STAB-1 (S7 reconnect, Critical, task 4) DONE** — `fix/archreview-crit3-s7-reconnect`
|
||||||
> (TwinCAT orphaned ADS subs, task 5); template both off OpcUaClient's reconnect machine; need docker-rig
|
> `25c0c6f6`; `IS7Plc`/`IS7PlcFactory` seam + lazy `EnsureConnectedAsync`; 4 unit guards + LIVE-verified
|
||||||
> fixtures. Then STAB-4/5 (AbCip lock, FOCAS caches) + Part B shared-template consolidation. See [`STATUS.md`](STATUS.md).
|
> against real snap7 (container bounce → recovers, no redeploy). **STAB-2 (TwinCAT orphaned ADS subs,
|
||||||
|
> Critical, task 5) NEXT** — unit-only (no TwinCAT docker fixture). Then STAB-4/5 (AbCip lock, FOCAS caches)
|
||||||
|
> + Part B shared-template consolidation. See [`STATUS.md`](STATUS.md).
|
||||||
|
|
||||||
**Source report:** `archreview/05-protocol-drivers.md`
|
**Source report:** `archreview/05-protocol-drivers.md`
|
||||||
**Review commit:** `9cad9ed0` (== current HEAD, so no drift)
|
**Review commit:** `9cad9ed0` (== current HEAD, so no drift)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ truth for remediation progress. Update it as work lands.
|
|||||||
| `docs/archreview-plans-and-drift-fixes` | `9fadead6` | the 7 domain plans + `00-INDEX.md` + this `STATUS.md` + the two CLAUDE.md doc-drift fixes. **(the plans live ONLY here)** |
|
| `docs/archreview-plans-and-drift-fixes` | `9fadead6` | the 7 domain plans + `00-INDEX.md` + this `STATUS.md` + the two CLAUDE.md doc-drift fixes. **(the plans live ONLY here)** |
|
||||||
| `fix/archreview-crit1-split-brain-resolver` | `a81dea10` | Critical 1 (03/S1) activation + guard test + Redundancy.md |
|
| `fix/archreview-crit1-split-brain-resolver` | `a81dea10` | Critical 1 (03/S1) activation + guard test + Redundancy.md |
|
||||||
| `fix/archreview-crit2-vt-timeout` | `7fd44f0f` | Critical 2 (02/U2 + 02/U3) + tests |
|
| `fix/archreview-crit2-vt-timeout` | `7fd44f0f` | Critical 2 (02/U2 + 02/U3) + tests |
|
||||||
|
| `fix/archreview-crit3-s7-reconnect` | `25c0c6f6` | Critical 3 (05/STAB-1) IS7Plc seam + lazy reconnect + unit guards + live bounce test |
|
||||||
|
|
||||||
**Decision (user):** one branch per Critical, each off `master`. The plans are only on the docs branch,
|
**Decision (user):** one branch per Critical, each off `master`. The plans are only on the docs branch,
|
||||||
so from a critical branch read them via `git show docs/archreview-plans-and-drift-fixes:archreview/plans/0X-<name>.md`.
|
so from a critical branch read them via `git show docs/archreview-plans-and-drift-fixes:archreview/plans/0X-<name>.md`.
|
||||||
@@ -24,6 +25,7 @@ so from a critical branch read them via `git show docs/archreview-plans-and-drif
|
|||||||
| **Critical 2b — ALC-safe compile cache** | 02/U3 | same `7fd44f0f` | Swapped raw dict → `CompiledScriptCache`; new `IScriptCacheOwner` seam; apply-boundary clear in `VirtualTagHostActor`; wiring guard test. Runtime VT 12/12. |
|
| **Critical 2b — ALC-safe compile cache** | 02/U3 | same `7fd44f0f` | Swapped raw dict → `CompiledScriptCache`; new `IScriptCacheOwner` seam; apply-boundary clear in `VirtualTagHostActor`; wiring guard test. Runtime VT 12/12. |
|
||||||
| **Doc drift — KNOWN LIMITATION 2 stale** | 03/U1 = 06/U-1 | `docs/…` `9fadead6` (CLAUDE.md) | historized-ref feed IS wired; rewrote to "value-capture code-complete, live-verify pending". |
|
| **Doc drift — KNOWN LIMITATION 2 stale** | 03/U1 = 06/U-1 | `docs/…` `9fadead6` (CLAUDE.md) | historized-ref feed IS wired; rewrote to "value-capture code-complete, live-verify pending". |
|
||||||
| **Doc drift — ScriptAnalysis policy** | theme #5 | same `9fadead6` (CLAUDE.md) | corrected `FleetAdmin` → `Administrator,Designer` roles. |
|
| **Doc drift — ScriptAnalysis policy** | theme #5 | same `9fadead6` (CLAUDE.md) | corrected `FleetAdmin` → `Administrator,Designer` roles. |
|
||||||
|
| **Critical 3 — S7 lazy reconnect** | 05/STAB-1 | `fix/archreview-crit3-s7-reconnect` `25c0c6f6` | New `IS7Plc`/`IS7PlcFactory` seam + `EnsureConnectedAsync` (dispose-dead-handle → reopen on next data call); connection-fatal faults (socket/`ErrorCode.ConnectionError`) mark the handle dead, data-address errors do NOT; probe loop routes through it as a backstop. 4 unit guards + full S7 suite 234/234; **LIVE-verified** against real python-snap7 — bounced the container (`docker restart`), driver observed the outage and resumed Good reads with no redeploy (`S7_1500ReconnectTests`, double-gated on sim + `S7_RECONNECT_BOUNCE_CMD`). Also closes the S7 TEST-1 gap. |
|
||||||
|
|
||||||
## Task list (TaskCreate IDs)
|
## Task list (TaskCreate IDs)
|
||||||
|
|
||||||
@@ -32,7 +34,7 @@ so from a critical branch read them via `git show docs/archreview-plans-and-drif
|
|||||||
| 1 | Critical 1 — split-brain resolver | ✅ completed |
|
| 1 | Critical 1 — split-brain resolver | ✅ completed |
|
||||||
| 2 | Critical 2a — VT timeout | ✅ completed |
|
| 2 | Critical 2a — VT timeout | ✅ completed |
|
||||||
| 3 | Critical 2b — CompiledScriptCache | ✅ completed |
|
| 3 | Critical 2b — CompiledScriptCache | ✅ completed |
|
||||||
| 4 | Critical 3 — S7 reconnect (05/STAB-1) | ⬜ pending |
|
| 4 | Critical 3 — S7 reconnect (05/STAB-1) | ✅ completed |
|
||||||
| 5 | Critical 4 — TwinCAT ADS re-registration (05/STAB-2) | ⬜ pending |
|
| 5 | Critical 4 — TwinCAT ADS re-registration (05/STAB-2) | ⬜ pending |
|
||||||
| 6 | Guard — DeferredAddressSpaceSink reflection forwarding test (03/U2) | ⬜ pending — **must precede** 03/P1 surgical-adds + any new sink capability |
|
| 6 | Guard — DeferredAddressSpaceSink reflection forwarding test (03/U2) | ⬜ pending — **must precede** 03/P1 surgical-adds + any new sink capability |
|
||||||
| 7 | Guard — wire OTOPCUA0001 analyzer + triage (07/C-1) | ⬜ pending — triage before Warning severity; C-1 triage → C-2 |
|
| 7 | Guard — wire OTOPCUA0001 analyzer + triage (07/C-1) | ⬜ pending — triage before Warning severity; C-1 triage → C-2 |
|
||||||
@@ -41,8 +43,12 @@ so from a critical branch read them via `git show docs/archreview-plans-and-drif
|
|||||||
|
|
||||||
## Suggested next (from 00-INDEX execution order)
|
## Suggested next (from 00-INDEX execution order)
|
||||||
|
|
||||||
1. **Critical 3 (05/STAB-1)** + **Critical 4 (05/STAB-2)** — template both off OpcUaClient's reconnect
|
1. **Critical 4 (05/STAB-2)** — TwinCAT ADS notification re-registration after reconnect. Store a
|
||||||
machine; effort-M, need docker-rig fixtures (`lmxopcua-fix up s7 s7_1500`, TwinCAT sim). New branches each.
|
replayable registration intent (symbol/type/bitIndex/interval/onChange) per subscribed tag and replay
|
||||||
|
it on client swap; the fake `ITwinCATClientFactory`/`ITwinCATClient` already exist, so a
|
||||||
|
`TwinCATReconnectReplayTests` can be deterministic. **No TwinCAT docker fixture exists** (13 integration
|
||||||
|
tests need a real TC3 target), so unit-only — no live gate available like S7 had. New branch off master.
|
||||||
|
*(Critical 3 (05/STAB-1) DONE — see Completed table, LIVE-verified against real snap7.)*
|
||||||
2. **Systemic guards** — task 7 (analyzer) then task 8 (CI); task 6 (forwarding test) before any P1/P2 work.
|
2. **Systemic guards** — task 7 (analyzer) then task 8 (CI); task 6 (forwarding test) before any P1/P2 work.
|
||||||
3. **Failure-visibility Highs** — 01/S-1 (AddressSpaceApplyOutcome failure field), 06/S-1 (Galaxy fail-closed),
|
3. **Failure-visibility Highs** — 01/S-1 (AddressSpaceApplyOutcome failure field), 06/S-1 (Galaxy fail-closed),
|
||||||
03/S4 (primary-gate default-deny).
|
03/S4 (primary-gate default-deny).
|
||||||
|
|||||||
Reference in New Issue
Block a user