{
  "planPath": "archreview/plans/R2-01-s7-fault-hardening-plan.md",
  "tasks": [
    {
      "id": 0,
      "subject": "Extend reconnect-test fakes with token-honouring hang + probe-fault modes (FakeS7Plc/FakeS7PlcFactory)",
      "status": "completed",
      "blockedBy": []
    },
    {
      "id": 1,
      "subject": "RED: connect-timeout regression tests T1+T3 (read/write degrade instead of throwing OCE) — must FAIL at f6eaa267",
      "status": "completed",
      "blockedBy": [0]
    },
    {
      "id": 2,
      "subject": "RED: poll-loop-survival test T2 (subscription survives connect-timeout outage) + caller-cancel pinning test T4",
      "status": "completed",
      "blockedBy": [0, 1]
    },
    {
      "id": 3,
      "subject": "GREEN: EnsureConnectedAsync + InitializeAsync connect-timeout OCE -> TimeoutException conversion (STAB-14 root fix)",
      "status": "completed",
      "blockedBy": [1, 2]
    },
    {
      "id": 4,
      "subject": "Defensive when-filters on ensure-wrapper OCE rethrows (:488/:1000) + poll-loop OCE catches (:1383/:1396/:1404)",
      "status": "completed",
      "blockedBy": [3]
    },
    {
      "id": 5,
      "subject": "Finding-1 close gate: full S7 unit + CLI test-project sweep green",
      "status": "completed",
      "blockedBy": [4]
    },
    {
      "id": 6,
      "subject": "RED: framing-fault classification Theory T5 (TPKT/TPDU/WrongNumberOfBytes/PlcException-WrongNumberReceivedBytes reopen) — must FAIL",
      "status": "completed",
      "blockedBy": [0]
    },
    {
      "id": 7,
      "subject": "GREEN: broaden IsS7ConnectionFatal to the ISO-on-TCP framing surface (NOT InvalidDataException) + xmldoc (STAB-15a)",
      "status": "completed",
      "blockedBy": [6]
    },
    {
      "id": 8,
      "subject": "RED->GREEN: cancellation-during-I/O marks handle dead (T6 read + T7 write; per-item OCE catches set _plcDead before propagating)",
      "status": "completed",
      "blockedBy": [7]
    },
    {
      "id": 9,
      "subject": "RED->GREEN: probe marks handle dead under the gate (T8 persistent probe fault + T9 probe timeout; ProbeLoopAsync inner catch restructure, STAB-15b)",
      "status": "completed",
      "blockedBy": [8]
    },
    {
      "id": 10,
      "subject": "Doc: R2-09 connect-throttle seam note on EnsureConnectedAsync <remarks> (STAB-8 S7 part, note-only)",
      "status": "completed",
      "blockedBy": [3]
    },
    {
      "id": 11,
      "subject": "Env-gated live connect-timeout outage test (S7_TIMEOUT_OUTAGE_START_CMD/STOP_CMD blackhole design; skips cleanly offline)",
      "status": "deferred-live",
      "note": "env-gated; runs in serial live pass (integration suite; serialized heavy pass). Test authored + committed; verified it SKIPs cleanly offline.",
      "blockedBy": [5]
    },
    {
      "id": 12,
      "subject": "Close-out: whole-suite sweep + update archreview STATUS.md and 05 prior-finding table (STAB-14/15 FIXED, STAB-8 seam noted)",
      "status": "completed",
      "note": "S7 unit 246/246 green; S7 CLI 48/49 (1 pre-existing unrelated comment-scan failure, see deviations); solution BUILD clean (0 errors). Whole-solution dotnet test NOT run per controller memory-constraint (integration suites deferred to serial heavy pass).",
      "blockedBy": [5, 7, 8, 9, 10, 11]
    }
  ],
  "lastUpdated": "2026-07-13"
}
