eb445ea7e7
SQL-Server hub topology (ScadaBridge) is live-validated against a real SQL Server 2022 with two nodes: write->resolve via hub, tombstone propagation without resurrection, bidirectional sweep, partitioned-node local resolution (site autonomy - the reason hub mode was chosen), and wrong-KEK fail-closed via SecretDecryptionException. Akka peer-to-peer topology (OtOpcUa) FAILS the gate: resolving ISecretReplicator hangs indefinitely in a real clustered process. Reproduced twice on a healthy 2-node cluster; isolated to constructing AkkaSecretReplicator -> ActorRef -> system.ActorOf, NOT nested DI resolution. The library's own 2-node suite passes, so the trigger is creation through DI in a hosted process. Root cause not yet identified. Impact: OtOpcUa would hang at startup if replication were enabled, since the startup hook resolves ISecretStore. Harmless today only because the flag defaults false. Do NOT enable Secrets:Replication:Enabled in OtOpcUa. The gate did its job - it caught a blocking defect that every offline suite, including the library's own real-cluster tests, had passed over.
128 lines
3.1 KiB
JSON
128 lines
3.1 KiB
JSON
{
|
|
"planPath": "docs/plans/2026-07-18-secrets-0.2.0-upgrade-and-clustering.md",
|
|
"tasks": [
|
|
{
|
|
"id": 1,
|
|
"nativeId": "7",
|
|
"subject": "Task 1: HistorianGateway bump 0.1.2 -> 0.2.0",
|
|
"status": "completed",
|
|
"classification": "trivial",
|
|
"parallelizableWith": [
|
|
2,
|
|
3,
|
|
4
|
|
]
|
|
},
|
|
{
|
|
"id": 2,
|
|
"nativeId": "8",
|
|
"subject": "Task 2: MxAccessGateway bump 0.1.2 -> 0.2.0",
|
|
"status": "completed",
|
|
"classification": "trivial",
|
|
"parallelizableWith": [
|
|
1,
|
|
3,
|
|
4
|
|
]
|
|
},
|
|
{
|
|
"id": 3,
|
|
"nativeId": "9",
|
|
"subject": "Task 3: OtOpcUa bump 0.1.2 -> 0.2.0 (CPM)",
|
|
"status": "completed",
|
|
"classification": "trivial",
|
|
"parallelizableWith": [
|
|
1,
|
|
2,
|
|
4
|
|
]
|
|
},
|
|
{
|
|
"id": 4,
|
|
"nativeId": "10",
|
|
"subject": "Task 4: ScadaBridge bump 0.1.2 -> 0.2.0 (CPM)",
|
|
"status": "completed",
|
|
"classification": "trivial",
|
|
"parallelizableWith": [
|
|
1,
|
|
2,
|
|
3
|
|
]
|
|
},
|
|
{
|
|
"id": 5,
|
|
"nativeId": "11",
|
|
"subject": "Task 5: OtOpcUa add Akka replicator package",
|
|
"status": "completed",
|
|
"classification": "small",
|
|
"blockedBy": [
|
|
3
|
|
],
|
|
"parallelizableWith": [
|
|
7
|
|
]
|
|
},
|
|
{
|
|
"id": 6,
|
|
"nativeId": "12",
|
|
"subject": "Task 6: OtOpcUa wire Akka replication + shared KEK",
|
|
"status": "completed",
|
|
"classification": "high-risk",
|
|
"blockedBy": [
|
|
5
|
|
]
|
|
},
|
|
{
|
|
"id": 7,
|
|
"nativeId": "13",
|
|
"subject": "Task 7: ScadaBridge add SqlServer replicator package",
|
|
"status": "completed",
|
|
"classification": "standard",
|
|
"blockedBy": [
|
|
4
|
|
],
|
|
"parallelizableWith": [
|
|
5
|
|
]
|
|
},
|
|
{
|
|
"id": 8,
|
|
"nativeId": "14",
|
|
"subject": "Task 8: ScadaBridge wire hub replication + per-node config",
|
|
"status": "completed",
|
|
"classification": "high-risk",
|
|
"blockedBy": [
|
|
7
|
|
]
|
|
},
|
|
{
|
|
"id": 9,
|
|
"nativeId": "15",
|
|
"subject": "Task 9: Live convergence gate (both clustered apps)",
|
|
"status": "completed",
|
|
"classification": "high-risk",
|
|
"blockedBy": [
|
|
6,
|
|
8
|
|
]
|
|
},
|
|
{
|
|
"id": 10,
|
|
"nativeId": "16",
|
|
"subject": "Task 10: Docs reconcile",
|
|
"status": "completed",
|
|
"classification": "small",
|
|
"blockedBy": [
|
|
9
|
|
]
|
|
}
|
|
],
|
|
"checkpoints": [
|
|
{
|
|
"afterTask": 4,
|
|
"note": "All four apps on 0.2.0, advisory closed family-wide. Independently shippable \u2014 FF-merge and push each repo before Task 5."
|
|
}
|
|
],
|
|
"lastUpdated": "2026-07-18",
|
|
"notes": "Tasks 1-10 complete. Live gate RUN 2026-07-18 with a SPLIT result: SQL-Server hub (ScadaBridge) PASSED 6/6 against a real SQL Server 2022 incl. partition survival and wrong-KEK fail-closed. Akka peer-to-peer (OtOpcUa) FAILED - resolving ISecretReplicator deadlocks in a real clustered process at ActorOf. Replication remains default-OFF everywhere; do NOT enable it in OtOpcUa until the deadlock is fixed."
|
|
} |