Files
lmxopcua/archreview/plans/R2-04-failure-visibility-plan.md.tasks.json
T
Joseph Doherty eccb15bdab
v2-ci / build (pull_request) Successful in 4m8s
v2-ci / unit-tests (pull_request) Failing after 11m0s
docs(archreview): R2-04 T13/T15 live-passed 2026-07-14
Both R2-04 verification gates for the S4 primary-gate default-deny run:
- T15 (docker-dev 2-node rig, rebuilt from master 365a90e6 + Modbus sim):
  ServiceLevel 250/240; boot-window write rejected 'not primary (role
  unknown)' (meter reason=role-unknown,site=write); steady-state
  secondary rejected 'not primary' + node reverted (read-back 1234 not
  9999, meter reason=secondary); primary write reaches device; clean
  apply (no apply.failed). The behavior-affecting S4 slice is trusted.
- T13 (in-process PrimaryGateFailoverTests): 1/1, ran without SQL; the
  real DPS-delivered snapshot drives the gate; negative control covered.

STATUS.md + R2-04 tasks.json updated.
2026-07-14 15:13:43 -04:00

123 lines
4.0 KiB
JSON

{
"planPath": "archreview/plans/R2-04-failure-visibility-plan.md",
"lastUpdated": "2026-07-12",
"tasks": [
{
"id": "T1",
"subject": "Extend AddressSpaceApplyOutcome with RebuildFailed/FailedNodes + SafeRebuild returns bool (01/S-1)",
"status": "completed",
"blockedBy": []
},
{
"id": "T2",
"subject": "Safe* helpers return bool; Apply tallies removal-pass failures into FailedNodes",
"status": "completed",
"blockedBy": [
"T1"
]
},
{
"id": "T3",
"subject": "Materialise* passes return swallowed-failure counts (void -> int, five methods)",
"status": "completed",
"blockedBy": [
"T2"
]
},
{
"id": "T4",
"subject": "OpcUaApplyFailed counter + OpcUaPublishActor Error/meter surfacing of degraded applies",
"status": "completed",
"blockedBy": [
"T3"
]
},
{
"id": "T5",
"subject": "Galaxy internal IMxWriteOps seam under GatewayGalaxyDataWriter (sealed SDK session untestable) (06/S-1)",
"status": "completed",
"blockedBy": []
},
{
"id": "T6",
"subject": "Galaxy fail-closed write on AdviseSupervisory failure -> BadCommunicationError, no raw write",
"status": "completed",
"blockedBy": [
"T5"
]
},
{
"id": "T7",
"subject": "Galaxy counters galaxy.writes.advise_failed + galaxy.writes.unconfirmed (empty-statuses Good metered)",
"status": "completed",
"blockedBy": [
"T6"
]
},
{
"id": "T8",
"subject": "Galaxy skip-gated live smoke: normal advised write still returns Good post-change",
"status": "completed",
"blockedBy": [
"T6"
]
},
{
"id": "T9",
"subject": "PrimaryGatePolicy pure class + truth-table tests + otopcua.redundancy.primary_gate_denied counter (03/S4)",
"status": "completed",
"blockedBy": []
},
{
"id": "T10",
"subject": "Wire DriverHostActor gates (:977/:1039/:1095) through PrimaryGatePolicy with member-count provider + S5 log-once",
"status": "completed",
"blockedBy": [
"T9"
]
},
{
"id": "T11",
"subject": "DriverHostActorPrimaryGateTests: deny-on-unknown multi-node, allow single-node, ack/emit variants, meter tags",
"status": "completed",
"blockedBy": [
"T10"
]
},
{
"id": "T12",
"subject": "ScriptedAlarmHostActor alerts-emit gate adopts PrimaryGatePolicy (consistency extension)",
"status": "completed",
"blockedBy": [
"T9"
]
},
{
"id": "T13",
"subject": "In-process 2-node delivery-path test (TwoNodeClusterHarness): DPS-delivered snapshot drives the gate",
"status": "completed",
"note": "DONE 2026-07-14: PrimaryGateFailoverTests PASS 1/1 (3s), ran without SQL (gate test needs only the in-process 2-node cluster + DPS snapshot). Delivered snapshot promotes exactly one Primary; negative-control (broken subscribe) times out. See STATUS.md.",
"blockedBy": [
"T11"
]
},
{
"id": "T14",
"subject": "docs/Redundancy.md: gate policy table, boot-window client experience, new meters, Galaxy fail-closed semantics",
"status": "completed",
"blockedBy": []
},
{
"id": "T15",
"subject": "LIVE GATE: 2-node docker-dev rig verify (ServiceLevel 240/100, boot-window write rejected+reverted, single /alerts row)",
"status": "completed",
"note": "DONE 2026-07-14: docker-dev 2-node rig rebuilt from master 365a90e6 + Modbus sim up. ServiceLevel 250/240; boot-window write rejected \"not primary (role unknown)\" (meter reason=role-unknown,site=write); steady-state secondary rejected \"not primary\" + node reverted (read-back 1234 not 9999, meter reason=secondary); primary write reaches device; clean apply (no apply.failed). Full record in STATUS.md.",
"blockedBy": [
"T10",
"T11",
"T12",
"T13"
]
}
]
}