docs(archreview): mark guard 03/U2 (deferred-sink forwarding test) done
This commit is contained in:
@@ -3,8 +3,10 @@
|
||||
> **Status (2026-07-08):** ✅ **S1 (Critical) activation DONE** — branch `fix/archreview-crit1-split-brain-resolver`
|
||||
> @ `a81dea10` (typed `KeepOldestOption`, unit guards + e2e config-resolution verified). ✅ **U1 doc DONE**
|
||||
> (CLAUDE.md KNOWN LIMITATION 2 corrected). ⬜ S1's hard-kill failover **integration test** still pending (task 9,
|
||||
> effort-M). ⬜ **U2 (reflection forwarding test) pending — MUST land before P1 surgical-adds** / any new sink
|
||||
> capability. Remaining: P1, S2/S3/S4. See [`STATUS.md`](STATUS.md).
|
||||
> effort-M). ✅ **U2 (reflection forwarding test) DONE** — branch `fix/archreview-u2-deferred-sink-forwarding-guard`
|
||||
> @ `a65c2ced` (DispatchProxy-based exhaustive forwarding guard over `IOpcUaAddressSpaceSink` +
|
||||
> `ISurgicalAddressSpaceSink` + `DeferredServiceLevelPublisher`; negative-control verified; the gate for P1/P2 is
|
||||
> now in place). Remaining: P1, S2/S3/S4. See [`STATUS.md`](STATUS.md).
|
||||
|
||||
- **Source report:** `archreview/03-server-runtime.md`
|
||||
- **Review commit:** `9cad9ed0`
|
||||
|
||||
@@ -13,6 +13,7 @@ truth for remediation progress. Update it as work lands.
|
||||
| `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 |
|
||||
| `fix/archreview-crit4-twincat-replay` | `af318fb4` | Critical 4 (05/STAB-2) native-notification replay + probe-recycle + unit guards |
|
||||
| `fix/archreview-u2-deferred-sink-forwarding-guard` | `a65c2ced` | Guard 03/U2 — reflection-exhaustive deferred-sink forwarding test (+ DeferredServiceLevelPublisher) |
|
||||
|
||||
**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`.
|
||||
@@ -28,6 +29,7 @@ so from a critical branch read them via `git show docs/archreview-plans-and-drif
|
||||
| **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. |
|
||||
| **Critical 4 — TwinCAT native-notification replay** | 05/STAB-2 | `fix/archreview-crit4-twincat-replay` `af318fb4` | Native ADS notifications were opaque handles (no replayable intent) → silently orphaned on a client swap. Now `NativeRegistration` (symbol/type/bit/interval/onChange + swappable handle) hangs off `DeviceState`; `EnsureConnectedAsync` split into a gate wrapper + under-gate core that **replays every intent onto a freshly-built client** (register+replay both under `ConnectGate`); probe-failure `RecycleClientAsync` disposes+nulls the wire-dead-but-port-open client so the next tick rebuilds+replays. 4 unit guards + full TwinCAT suite 174/174. **Unit-only — no TwinCAT docker fixture exists** (integration needs a real TC3 XAR), so the fake-client tests are authoritative (no live gate like S7 had). |
|
||||
| **Guard — reflection-exhaustive deferred-sink forwarding** | 03/U2 | `fix/archreview-u2-deferred-sink-forwarding-guard` `a65c2ced` | New `DeferredSinkForwardingReflectionTests` (Commons.Tests) reflects over **every** method of every forwarding interface `DeferredAddressSpaceSink` implements (`IOpcUaAddressSpaceSink` + `ISurgicalAddressSpaceSink`) — plus the sibling `DeferredServiceLevelPublisher` — invokes each on the wrapper over a `DispatchProxy` recording inner, and asserts the call **reached** the inner. A `DispatchProxy` recorder auto-implements future members (zero maintenance); a guard-of-the-guard asserts the wrapper implements exactly the known forwarding-interface set, so a brand-new capability *interface* trips too. **This closes the F10b/PR#423 trap class and is the prerequisite gate for 03/P1 remove methods + 02/P `WriteValues`.** 3 new tests green (Commons.Tests 57/57); **negative control verified** — stubbing `UpdateFolderDisplayName` to a non-forwarding no-op fails the guard with the exact member-named diagnostic. NO production change. |
|
||||
|
||||
## Task list (TaskCreate IDs)
|
||||
|
||||
@@ -38,17 +40,18 @@ so from a critical branch read them via `git show docs/archreview-plans-and-drif
|
||||
| 3 | Critical 2b — CompiledScriptCache | ✅ completed |
|
||||
| 4 | Critical 3 — S7 reconnect (05/STAB-1) | ✅ completed |
|
||||
| 5 | Critical 4 — TwinCAT ADS re-registration (05/STAB-2) | ✅ completed |
|
||||
| 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) | ✅ completed — `a65c2ced`; gate for 03/P1 + 02/P now in place |
|
||||
| 7 | Guard — wire OTOPCUA0001 analyzer + triage (07/C-1) | ⬜ pending — triage before Warning severity; C-1 triage → C-2 |
|
||||
| 8 | Guard — CI to all unit suites + fail-on-skip (07/S-1,S-2, pair S-4) | ⬜ pending |
|
||||
| 9 | Critical 1 follow-up — hard-kill failover integration test (03/S1) | ⬜ pending — the effort-M harness half; activation itself is done+verified |
|
||||
|
||||
## Suggested next (from 00-INDEX execution order)
|
||||
|
||||
**All 4 Criticals are DONE** (see Completed table). Remaining work is the systemic guards + failure-visibility Highs:
|
||||
**All 4 Criticals are DONE** + the load-bearing forwarding guard (task 6) has landed. Remaining work is the two
|
||||
remaining systemic guards + the Critical-1 harness half + failure-visibility Highs:
|
||||
|
||||
1. **Systemic guards** — task 6 (`DeferredAddressSpaceSink` reflection forwarding test) **first**, before any P1/P2
|
||||
surgical-add work (else new sink caps ship inert — F10b/PR#423 class); then task 7 (wire OTOPCUA0001 analyzer,
|
||||
1. **Systemic guards** — task 6 (`DeferredAddressSpaceSink` reflection forwarding test) ✅ **DONE** (`a65c2ced`),
|
||||
so 03/P1 + 02/P surgical/batch adds can no longer ship inert. Next: task 7 (wire OTOPCUA0001 analyzer,
|
||||
triage before Warning severity) → task 8 (CI to all unit suites + fail-on-skip, pair the S-4 fixed-sleep flakes).
|
||||
2. **Critical 1 follow-up (task 9)** — the hard-kill failover integration test on the 2-node harness (the effort-M
|
||||
harness half; SBR activation itself is done+verified).
|
||||
@@ -59,9 +62,10 @@ so from a critical branch read them via `git show docs/archreview-plans-and-drif
|
||||
|
||||
- **Verification bar met so far:** each fix has a deterministic unit guard AND (for SBR) an end-to-end
|
||||
config-resolution check. Follow the same pattern — the review's whole thesis is "unit-green ≠ wired".
|
||||
- **The forwarding-test guard (task 6) is load-bearing:** 03/P1 (surgical pure-adds) and 02/P-… batch-write
|
||||
- **The forwarding-test guard (task 6) is DONE (`a65c2ced`):** 03/P1 (surgical pure-adds) and 02/P-… batch-write
|
||||
each add new sink capability methods that ship inert unless forwarded through `DeferredAddressSpaceSink`
|
||||
(F10b/PR#423 precedent). Land task 6 first.
|
||||
- **Nothing is pushed.** When the user asks to integrate: PR each `fix/archreview-crit*` branch; the docs
|
||||
branch can merge first (plans + doc fixes are low-risk).
|
||||
(F10b/PR#423 precedent). The reflection guard now fails loudly if any such member isn't forwarded — add the
|
||||
member to the recorder-covered interface set and it's auto-checked.
|
||||
- **Nothing is pushed.** When the user asks to integrate: PR each `fix/archreview-crit*` + the `u2` guard branch;
|
||||
the docs branch can merge first (plans + doc fixes are low-risk).
|
||||
- **Plans are on the docs branch only** — see topology note above for cross-branch reads.
|
||||
|
||||
Reference in New Issue
Block a user